Arrays.asList使用报UnsupportedOperationException异常错误

<pre class="prettyprint hljs gradle">// 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);</pre>

起先我以为 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 等未进行重写的方法了。