为什么我在尝试从List中删除元素时会收到UnsupportedOperationException异常?

617

我有这段代码:

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


1
使用 LinkedList。 - Lova Chittumuri
1
这个错误发生是因为我试图修改 collection.unmodifiablelist 列表。 - beginner
17个回答

4

当您尝试在不允许的集合上执行某些操作时,将出现此UnsupportedOperationException。在您的情况下,当您调用Arrays.asList时,它不会返回一个java.util.ArrayList。它返回一个不可变列表java.util.Arrays$ArrayList。您无法向其添加内容,也不能从其中删除内容。


3

是的,在Arrays.asList上,返回固定大小的列表。

除了使用链表外,只需使用addAll方法列表即可。

示例:

String idList = "123,222,333,444";

List<String> parentRecepeIdList = new ArrayList<String>();

parentRecepeIdList.addAll(Arrays.asList(idList.split(","))); 

parentRecepeIdList.add("555");

2

您不能从一个固定大小的数组列表中删除或添加数据。

但您可以从该列表创建子列表。

list = list.subList(0, list.size() - (list.size() - count));

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 = list.subList(0, list.size() - (list.size() - count));
   }
   return StringUtils.join(list, ", ");
}

另一种方法是

ArrayList<String> al = new ArrayList<String>(Arrays.asList(template));

这将创建一个ArrayList,与Arrays.asList不同的是它的大小不是固定的。


2

Arraylist narraylist=Arrays.asList(); // 返回不可变的ArrayList 如果要使其可变,解决方案如下: Arraylist narraylist=new ArrayList(Arrays.asList());

注:Original Answer翻译成“最初的回答”

1
欢迎来到SO。虽然我们感谢您的回答,但如果它能在其他答案的基础上提供额外的价值会更好。在这种情况下,您的回答没有提供额外的价值,因为另一个用户已经发布了该解决方案。如果之前的答案对您有帮助,请在获得足够的声望后投票支持它。 - technogeek1995

2
Arrays.asList() 使用固定大小的数组内部。
你无法动态地添加或删除Arrays.asList()中的元素。

使用以下方法代替:

Arraylist<String> narraylist=new ArrayList(Arrays.asList());

narraylist 中,您可以轻松添加或删除项目。最初的回答。

1
以下是来自数组的代码片段。
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方法会引发异常。
所以它不是常规的数组列表。

0

创建一个新列表并在其中填充有效值对我很有帮助。

代码抛出错误 -

List<String> list = new ArrayList<>();
   for (String s: list) {
     if(s is null or blank) {
        list.remove(s);
     }
   }
desiredObject.setValue(list);

修复后 -

 List<String> list = new ArrayList<>();
 List<String> newList= new ArrayList<>();
 for (String s: list) {
   if(s is null or blank) {
      continue;
   }
   newList.add(s);
 }
 desiredObject.setValue(newList);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接