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

异常: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 异常。

相关文章:

  • 【运维_日常报错解决方案_docker系列】一、docker系统不起来
  • OpenCV CUDA模块图像处理------颜色空间处理之用于执行伽马校正(Gamma Correction)函数gammaCorrection()
  • OpenCV CUDA模块图像处理------颜色空间处理之GPU 上对两张带有 Alpha 通道的图像进行合成操作函数alphaComp()
  • 传统数据表设计与Prompt驱动设计的范式对比:以NBA投篮数据表为例
  • 【请关注】VC++ MFC常见异常问题及处理方法
  • 【LeetCode 热题 100】打家劫舍 / 零钱兑换 / 单词拆分 / 乘积最大子数组 / 最长有效括号
  • react基础技术栈
  • [React]实现一个类zustand公共状态库
  • Nginx 性能优化全解析:从进程到安全的深度实践
  • HJ25 数据分类处理【牛客网】
  • 【前端】【React】React性能优化系统总结
  • 嵌入式学习--江协stm32day1
  • 电芯单节精密焊接机:以先进功能与特点赋能电池制造科技升级
  • java-jdk8新特性Stream流
  • 无人机多人协同控制技术解析
  • 武汉火影数字VR大空间制作
  • Vim 常用命令
  • 无人机停机坪运行技术分析!
  • 无人机仿真环境(3维)附项目git链接
  • 【分库分表】企业实战全流程总结
  • web网站开发有什么作用/免费产品推广软件
  • wordpress 获取第一张图片/搜索引擎优化推广
  • 有没有什么网站可以直接在网上做试题并且可以给你判出来/seo技术自学
  • 做网站建设有哪些公司/搜索引擎营销的概念
  • 怎么使用织梦做网站/黄冈免费网站推广平台汇总
  • 化妆品手机端网站模板/热点新闻事件素材