1. 概述
本文将深入探讨 Java 开发中一个常见的异常:UnsupportedOperationException
。当操作某些 List
实现时,这个异常会频繁出现,尤其在使用 Arrays.asList()
方法时。
java.util.List
提供了比普通数组更丰富的功能,例如快速判断元素是否存在。因此我们经常需要在数组和 List
之间转换。关于 ArrayList
的基础用法,可参考相关文档。
2. UnsupportedOperationException 异常解析
2.1 异常根源
这个异常最常出现在使用 java.util.Arrays.asList()
方法时:
public static List<T> asList(T... a)
该方法返回的 List
具有以下特点:
- ✅ 固定大小(与输入数组长度一致)
- ✅ 元素类型与原始数组相同(必须是
Object
) - ✅ 保持原始数组的元素顺序
- ✅ 实现了
Serializable
和RandomAccess
接口
由于 T
是可变参数(varargs),我们可以直接传递元素或数组:
List<String> flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");
或者传递数组:
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List<String> flowerList = Arrays.asList(flowers);
2.2 踩坑场景
⚠️ 关键陷阱:返回的 List
是固定大小的,不能添加或删除元素!
尝试添加元素会直接抛出异常:
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List<String> flowerList = Arrays.asList(flowers);
flowerList.add("Celosia"); // 抛出 UnsupportedOperationException
2.3 异常本质
这个异常的根源在于:
- 返回的对象不是
java.util.ArrayList
- 而是
java.util.Arrays
内部的ArrayList
类 - 该内部类未实现
add()
/remove()
等修改操作
同样,尝试删除元素也会触发相同异常。
2.4 正确解决方案
如果需要可变 List
,可通过以下方式转换:
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List<String> flowerList = new ArrayList<>(Arrays.asList(flowers));
这样创建的是真正的 java.util.ArrayList
,支持所有修改操作。
3. 总结
处理 List
时需特别注意:
- ❌
Arrays.asList()
返回的是固定大小的列表 - ✅ 需要修改操作时,必须包装成真正的
ArrayList
- ⚠️ 即使是可变集合,某些操作也可能抛出此异常(如不可变集合)
完整示例代码可在 GitHub 查看。