Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at org.example.Main.test_20251106_04(Main.java:123)
at org.example.Main.main(Main.java:115)
Java集合中的List集合分成可变和不可变,通过Arrays.asList()生成的是不可变集合,不能往里面添加元素
这个错误表明你正在尝试修改一个不可变(immutable)的列表 ,而 Java 的某些列表实现(如 Arrays.asList() 或 List.of() 创建的列表)不支持 add()、remove() 等修改操作 ,因此会抛出 UnsupportedOperationException。
错误原因分析
-
使用了不可变的列表 :
Arrays.asList()返回的列表是固定大小的,不能增删元素。List.of()(Java 9+)创建的列表是完全不可变的,任何修改操作都会报错。Collections.unmodifiableList()包装的列表也是不可变的。
-
错误示例 :
java`List<String> list = Arrays.asList("a", "b", "c"); list.add("d"); // ❌ 抛出 UnsupportedOperationException`java`List<String> list = List.of("a", "b", "c"); list.add("d"); // ❌ 抛出 UnsupportedOperationException`
解决方案
1. 使用可变的 ArrayList
如果需要修改列表(增删元素),应该使用 ArrayList:
java
`// ✅ 正确方式:用 ArrayList 包装
List<String> mutableList = new ArrayList<>(Arrays.asList("a", "b", "c"));
mutableList.add("d"); // ✅ 可以添加`
或直接初始化:
java
`List<String> list = new ArrayList<>();
list.add("a");
list.add("b");`
2. 避免直接修改 Arrays.asList() 或 List.of() 的列表
如果只是读取数据,不需要修改,可以直接使用:
java
`List<String> list = Arrays.asList("a", "b", "c");
for (String s : list) {
System.out.println(s); // ✅ 可以遍历
}`
但如果需要修改,必须转换:
java
`List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
list.add("d"); // ✅ 可以修改`
3. 检查 subList() 是否来自不可变列表
如果从不可变列表(如 List.of())获取 subList(),也会报错:
java
`List<String> original = List.of("a", "b", "c");
List<String> subList = original.subList(0, 2); // ❌ 抛出异常
subList.add("d"); // ❌ 仍然不可变`
正确做法:
java
`List<String> original = new ArrayList<>(List.of("a", "b", "c"));
List<String> subList = original.subList(0, 2); // ✅ 可以修改
subList.add("d"); // ✅ 成功`
总结
| 错误场景 | 原因 | 解决方案 |
|---|---|---|
Arrays.asList().add() |
返回固定大小列表 | 用 new ArrayList<>(Arrays.asList()) |
List.of().add() |
返回完全不可变列表 | 用 new ArrayList<>(List.of()) |
Collections.unmodifiableList().add() |
显式包装为不可变 | 不要用 unmodifiableList 或转换 |
subList() 来自不可变列表 |
子列表继承不可变性 | 从 ArrayList 获取 subList() |
关键点:
- 如果需要修改列表,必须使用
ArrayList或其他可变实现(如LinkedList)。 - 不可变列表(如
List.of())仅适用于只读场景。
检查你的代码(Main.java 第 123 行),确保你操作的列表是可变的!