Skip to content

java.lang.UnsupportedOperationException

🏷️ Java 9

在使用 Arrays.asList 方法将数组转为 List 后,再执行 List 的 addAll 方法时出现 "java.lang.UnsupportedOperationException" 异常。

java.lang.UnsupportedOperationException 虽然给出了解决方案,但是原因仍然不理解。


为了防止这个异常的发生,可以利用 List 接口的实例对象中的构造方法重新构造一次对象即可,上面程序改成:

java
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2));

2024-1-18 追记

Arrays.asList 方法的备注上其实已经做了说明:

Returns a fixed-size list backed by the specified array. Changes made to the array will be visible in the returned list, and changes made to the list will be visible in the array. The returned list is Serializable and implements RandomAccess.

The returned list implements the optional Collection methods, except those that would change the size of the returned list. Those methods leave the list unchanged and throw UnsupportedOperationException.

翻译过来就是:

返回一个由指定数组支持的固定大小的列表。对数组做出的更改将在返回的列表中可见,对列表做出的更改将在数组中可见。返回的列表是可序列化的并实现了 RandomAccess 接口。

返回的列表实现了可选的 Collection 方法,除了那些会改变返回列表大小的方法。这些方法会保持列表不变并抛出 UnsupportedOperationException 异常。

Arrays.asList 返回的列表其实际类型是 java.util.Arrays.ArrayList ,而不是 java.util.ArrayList 。虽然都是基于数组保存数据的,但是 java.util.ArrayList 会在容量不够时自动扩容,而 java.util.Arrays.ArrayList 则不支持这些会改变列表容量的处理。