转自 https://blog.csdn.net/Tracycater/article/details/77592472?locationNum=2&fps=1
做开发一定要注重细节。在项目中对 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"); } }