Java列表remove() 时报出 UnsupportedOperationException 的错误


Java列表remove() 时报出 UnsupportedOperationException 的错误

java.lang.UnsupportedOperationException
	at java.util.AbstractList.remove(AbstractList.java:161)
	at java.util.AbstractList$Itr.remove(AbstractList.java:374)
	at java.util.AbstractCollection.remove(AbstractCollection.java:293)
	......

错误原因 : 该List是一个AbstractList,不支持增删改操作

问题是在工作时遇到的,源代码就不展示了,模拟一个类似的场景进行DEBUG

@Test
public void test_delete(){
    List strings = Arrays.asList("A", "B", "C");
    strings.remove("A"); // 报出 UnsupportedOperationException
}

第一步:打断点

image-20220215172548778

第二步:启动debug模式,(F7)强行进入方法

image-20220215172715259

第三步:走到断点标记处,再次强行进入

image-20220215172919016

最后来到了 AbstractList抽象类的remove()

image-20220215172952871

结论: 通过 ArrayList.asList() 函数得到的 ArrayList 并不是我们常用的 java.util.ArrayList 而是 Arrays类中一个内部类ArrayList。

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

private static class ArrayList extends AbstractList
    implements RandomAccess, java.io.Serializable
{  .....  }