当前位置: 首页 > article >正文

异常: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<>()

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

List<String> mutableList = new ArrayList<>();
mutableList.add("A");
mutableList.add("B");
mutableList.remove("A");

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

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

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

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

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

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

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

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

4. Java 8 Stream 生成可变列表

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

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() 的结果:除非明确知道只需修改元素值。


示例场景

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

// 假设从数据库查询到一组不可变数据
List<String> dbResults = List.of("User1", "User2", "User3");// 转为可变列表以便后续操作
List<String> editableList = new ArrayList<>(dbResults);// 动态增删
editableList.add("User4");
editableList.remove("User1");

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

http://www.lryc.cn/news/2393963.html

相关文章:

  • Ubuntu 24.04 LTS 和 ROS 2 Jazzy 环境中使用 Livox MID360 雷达
  • 自动化立体仓库堆垛机SRM控制系统FC19手动控制功能块开发
  • Ollama(1)知识点配置篇
  • VMware Workstation虚拟系统设置双网口
  • Qt基础终结篇:从文件操作到多线程异步UI,深度解析核心要点
  • ubuntu中,文本编辑器nano和vim区别,vim的用法
  • 山洪灾害声光电监测预警解决方案
  • 【Rust模式与匹配】Rust模式与匹配深入探索与应用实战
  • React从基础入门到高级实战:React 高级主题 - React Concurrent 特性:深入探索与实践指南
  • electron安装报错处理
  • NHANES指标推荐:CQI
  • 【OpenHarmony】【交叉编译】使用gn在Linux编译3568a上运行的可执行程序
  • Med-R1论文阅读理解-1
  • 【从零开始学习QT】快捷键、帮助文档、Qt窗口坐标体系
  • 强化学习笔记总结(结合论文)
  • Java线程安全解决方案全面指南
  • superior哥深度学习系列(大纲)
  • 基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)
  • 实验分享|基于sCMOS相机科学成像技术的耐高温航空涂层材料损伤检测实验
  • RAG混合检索:倒数秩融合RRF算法
  • 2011肠衣问题
  • RG3000网关构建5G LAN智慧工厂智能制造
  • Rust语言学习教程、案例与项目实战指引
  • 通信应用高速模数转换器ADC
  • 大模型测评选型指南:企业级大模型测评实战解析
  • 微信小程序学习目录
  • AG32 DMAC实现内部MCU与FPGA通信【知识库】
  • webrtc初了解
  • [STM32学习笔记(九)]CubeMX项目使用系统定时器SysTick的中断服务函数进行定时
  • 5G 核心网 NGAP UE-TNL 偶联和绑定