异常:UnsupportedOperationException: null

异常信息

Not Implemented java.lang.UnsupportedOperationException: null at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111) at java.base/java.util.AbstractCollection.addAll(AbstractCollection.java:352)

原因分析:

  • 当传入的列表由Arrays.asList()List.of()生成时,这些列表不可变,调用add()addAll()会抛出异常。

  • 通过创建新的ArrayList实例,复制原列表内容,确保后续操作在可变列表上进行,彻底解决问题。

此修改保证了无论调用方传入何种类型的列表,方法内部始终使用可变列表,从而避免UnsupportedOperationException

解决方案

在 Java 中,若需要创建可变的列表,可以使用以下方法:


1. 直接使用 new ArrayList<>()new LinkedList<>()

这是最常见且推荐的方式,可以动态增删元素:

java 复制代码
List<String> mutableList = new ArrayList<>();
mutableList.add("A");
mutableList.add("B");
mutableList.remove("A");

2. 基于 List.of() 创建可变副本

如果希望基于不可变列表初始化数据,再转为可变列表:

java 复制代码
List<String> immutableList = List.of("A", "B", "C");
List<String> mutableList = new ArrayList<>(immutableList); // 转为可变
mutableList.add("D"); // 允许操作

3. 使用 Arrays.asList()(但有限制)

Arrays.asList() 返回的列表允许修改元素值 ,但不允许增删元素(会抛出异常):

java 复制代码
List<String> semiMutableList = Arrays.asList("A", "B");
semiMutableList.set(0, "X"); // ✅ 允许修改
semiMutableList.add("C");     // ❌ 抛出 UnsupportedOperationException

若需要完全可变,可配合 new ArrayList<>()

java 复制代码
List<String> mutableList = new ArrayList<>(Arrays.asList("A", "B"));
mutableList.add("C"); // ✅ 允许增删

4. Java 8 Stream 生成可变列表

通过 Collectors.toList() 生成的列表是可变的:

java 复制代码
List<String> mutableList = Stream.of("A", "B", "C")
                                .collect(Collectors.toList());
mutableList.add("D"); // ✅ 允许操作

关键区别总结

方法 是否可变 能否增删元素 初始化方式
List.of() 不可变 直接初始化元素
Arrays.asList() 半可变 基于数组初始化
new ArrayList<>() 可变 空列表或基于其他集合初始化
Collectors.toList() 可变 通过 Stream 生成

最佳实践

  • 需要动态增删元素时 :优先使用 new ArrayList<>()new LinkedList<>()

  • 需要基于不可变列表初始化 :用 new ArrayList<>(List.of(...)) 转为可变。

  • 避免直接操作 Arrays.asList() 的结果:除非明确知道只需修改元素值。


示例场景

假设需要从数据库查询数据后动态修改列表:

java 复制代码
// 假设从数据库查询到一组不可变数据
List<String> dbResults = List.of("User1", "User2", "User3");

// 转为可变列表以便后续操作
List<String> editableList = new ArrayList<>(dbResults);

// 动态增删
editableList.add("User4");
editableList.remove("User1");

通过上述方法,可以灵活处理需要动态修改的列表,避免 UnsupportedOperationException 异常。

相关推荐
llwszx5 分钟前
【Java/Go后端手撸原生Agent(第九篇):Plan-and-Execute规划模式——从“走一步看一步“到“先谋后动“】
java·python·golang·agent开发·plan模式·规划执行模式
ZJH__GO14 分钟前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络
霸道流氓气质26 分钟前
SpringBoot中基于 AES-GCM + KMS 密钥管理的数据加解密 Starter 实践
java·数据库·spring boot
Gofarlic_OMS39 分钟前
NX浮动许可调度黑名单机制,对比两款谁更合理
java·大数据·运维·开源·制造
万岳科技系统开发1 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能
一只小灿灿1 小时前
C++ 修饰符全面详解
开发语言·c++
马里马里奥-1 小时前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt
乐观的Terry1 小时前
8、发布系统-完整流水线的核心
java·spring boot·spring·spring cloud
Alexalbb1 小时前
从角色过滤到可审计授权:单体系统数据权限设计复盘与演进
java
万亿少女的梦1681 小时前
基于Spring Boot的游戏交易管理系统设计与实现
java·spring boot·mysql·系统设计·交易管理