本文主要是介绍add、delete操作报UnsupportedOperationException的错,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
add、delete操作报UnsupportedOperationException的错
addAll操作报UnsupportedOperationException错误
上面的代码,粗粗一看发现,没有什么bug
String temp="1,2,3”;
List<String>list1 = Arrays.asList(temp.split(","));
list1.add("4");
可是报如下错误。就算报了错,也觉得没有错,难道list不能add吗?
后面才发现,其实不是不能add
,只要改变 list
大小的操作,都会报下面的错。
java.lang.UnsupportedOperationException
点进去看asList
的源码,发现asList
方法中返回了一个ArrayList
的对象。asList
的方法在java.util.Arrays
这个包中,在这个aslist
的方法的后面几行就是一个叫ArrayList
的内部类。
天啊,好坑啊。
@SafeVarargs@SuppressWarnings("varargs")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;ArrayList(E[] array) {a = Objects.requireNonNull(array);}@Overridepublic int size() {return a.length;}....
首先看出,asList
方法返回的ArrayList
只是java.util.Arrays
中的内部类,我们常用的new ArrayList
是java.util.Arraylist
.内部类中的ArrayList
继承了AbstractList
,但是并没有重写add
,remove
等方法,所以调用这些方法的时候调用的都是父类AbstractList
中的方法。
java.util.Arrays中的内部类private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable
我们先看AbstractList
包下的ArrayList
中add
方法
public boolean add(E e) {add(size(), e);return true;}public void add(int index, E element) {throw new UnsupportedOperationException();}
他在这里直接就给抛异常了。C语言。
平常使用的java.util
包下的ArrayList
中add
方法
public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;}
###所以,Arrays.asList()
返回的list
仅支持那些不会改变集合大小的操作。
如果要用的话,也可以如下使用:
List<String>list = new ArrayList<>(Arrays.asList(new String[]{"a", "b"}));list.add("c");System.out.println(list);
把Arrays.asList0
的结果作为构造器的参数传递给任何`Collection。这样就可以正常操作了
这篇关于add、delete操作报UnsupportedOperationException的错的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!