我有这样的代码:

public static String SelectRandomFromTemplate(String template,int count) {
   String[] split = template.split("|");
   List<String> list=Arrays.asList(split);
   Random r = new Random();
   while( list.size() > count ) {
      list.remove(r.nextInt(list.size()));
   }
   return StringUtils.join(list, ", ");
}

我明白了:

06-03 15:05:29.614: ERROR/AndroidRuntime(7737): java.lang.UnsupportedOperationException
06-03 15:05:29.614: ERROR/AndroidRuntime(7737):     at java.util.AbstractList.remove(AbstractList.java:645)

这样做是正确的吗?Java.15


当前回答

我认为取代:

List<String> list = Arrays.asList(split);

with

List<String> list = new ArrayList<String>(Arrays.asList(split));

解决问题。

其他回答

可能是因为您正在使用不可修改的包装器。

更改这一行:

List<String> list = Arrays.asList(split);

到这一行:

List<String> list = new LinkedList<>(Arrays.asList(split));

以下是来自Arrays的代码片段

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

所以当asList方法被调用时,它会返回它自己的私有静态类版本的列表,它不会覆盖AbstractList中的add函数来将元素存储在数组中。默认情况下,抽象列表中的add方法会抛出异常。

所以它不是正则数组列表。

我认为取代:

List<String> list = Arrays.asList(split);

with

List<String> list = new ArrayList<String>(Arrays.asList(split));

解决问题。

这个UnsupportedOperationException会在你试图对集合执行一些不允许的操作时出现,在你的情况下,当你调用数组时。asList不返回java.util.ArrayList。它返回一个java.util。数组$ArrayList是一个不可变列表。你不能向它添加,也不能从它删除。

Arrays.asList()返回的列表可能是不可变的。你能试试吗?

List<String> list = new ArrayList<>(Arrays.asList(split));