List 添加元素提示 UnsupportedOperationException

复制代码
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


错误原因分析

  1. 使用了不可变的列表

    • Arrays.asList() 返回的列表是固定大小的,不能增删元素。
    • List.of()(Java 9+)创建的列表是完全不可变的,任何修改操作都会报错。
    • Collections.unmodifiableList() 包装的列表也是不可变的。
  2. 错误示例

    复制代码

    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 行),确保你操作的列表是可变的!

相关推荐
码兄科技6 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研6 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe187 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_7 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff7 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯8 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地8 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123459 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
万亿少女的梦1689 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
微信开发api-视频号协议9 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad