背景
在项目中对 List 进行操作时报错 java.lang.UnsupportedOperationException
,后来发现操作的 List 是由数组转换而成的,通过看源码发现问题,并写测试程序如下:
public class ListTest {
public static void main(String[] args) {
String[] array = {"1","2","3","4","5"};
List<String> list = Arrays.asList(array);
list.add("6");
}
}
执行结果:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.atguigu.test.ListTest.main(ListTest.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
原因
调用 Arrays.asList()
产生的 List 中 add、remove 方法时报异常,这是由于 Arrays.asList()
返回的是 Arrays 的内部类ArrayList, 而不是 java.util.ArrayList
。Arrays的内部类 ArrayList 和 java.util.ArrayList 都是继承AbstractList,remove、add等方法在 AbstractList 中是默认 throw UnsupportedOperationException 而且不作任何操作。java.util.ArrayList 重写这些方法而Arrays的内部类ArrayList没有重写,所以会抛出异常。
解决方法
public class ListTest {
public static void main(String[] args) {
String[] array = {"1","2","3","4","5"};
List<String> list = Arrays.asList(array);
List arrList = new ArrayList(list);
arrList.add("6");
}
}