Arrays.asList使用报UnsupportedOperationException异常错误
Demo
String[] nums = new String[]{"1","2","3"}; List<String> asList = Arrays.asList(nums); ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); System.out.println(1); list.addAll(asList); System.out.println(2); asList.addAll(list); //运行至此处,报UnsupportedOperationException异常错误 System.out.println(3);
起先我以为 asList 和 list 都是 List 类,那么 addAll 方法应该都是可行的。但是通过 asList 创建的 List 在运用 addAll 方法的时候却会抛 UnsupportedOperationException 的异常报错。
根据其字面意思判断是 不支持的操作 的异常。难道 asList 创建的 List 不支持 addAll 方法?
于是乎分别点击进入追踪 list 的 addAll 方法 和 asList 的 addAll 方法:
list:
可以发现此处 ArrayList 的 addAll 方法是进行了重写的。
asList:
而这里 asList 的 addAll 方法定位进去后发现定位到了接口中的 addAll 方法。那就换个入口追踪,直接追踪 Arrays 的 asList 生成方法,试探性地研究一下:
噫,在 Arrays 类中竟然还有一个 同名为 ArrayList 的内部类,那么 asList 中新建的 ArrayList 应该就是这个内部类了,追踪一下,果然定位到了内部类中的构造方法了。
既然 asList 新建的是这个内部类,那就检查一下 addAll 方法吧,竟然没有重写 addAll 方法,那调用的就是 父类AbstractList 中的 addAll 方法了。进入 AbstractList 定位到 addAll 方法:
没有看到有抛出异常信息,那直接看主要的处理逻辑方法 add,定位进去:
NICE!水落石出,原因嘛就是因为 Arrays 中 asList 生成的 Arraylist 内部类 没有完全重写 AbstractList 中对元素操作的方法,导致部分方法并不被继承类所支持。
经过这次的经验,那至少以后不会用 asList 生成的 List 再去调用 add、addAll 等未进行重写的方法了。