Arrays.asList() 返回的 List 抛 UnsupportedOperationException,因其底层是固定大小的 Arrays$ArrayList,不支持增删操作,仅允许修改已有元素;需可变集合时应显式包装为 new ArrayList()。

如何解决Java中UnsupportedOperationException异常_集合不可变性

为什么 Arrays.asList() 返回的 List 会抛 UnsupportedOperationException

因为 Arrays.asList() 返回的是一个固定大小、底层由原始数组支撑的 List 实现(Arrays$ArrayList),它不支持增删操作,只允许修改已有元素。调用 add()remove()clear() 等方法时直接抛出该异常。

常见错误现象:Exception in thread "main" java.lang.UnsupportedOperationException at java.util.Arrays$ArrayList.add(Arrays.java:...)

哪些集合工厂方法返回的是不可变集合(Java 9+)

Java 9 引入的 List.of()Set.of()Map.of() 全部返回不可变实例,任何修改操作都会触发 UnsupportedOperationException

错误示例:list.add("x")list = List.of("a", "b") 后执行,立刻失败

如何安全地从不可变集合派生可变副本

不能靠强制类型转换,也不能依赖“看起来像能改”——必须走构造器或工具方法明确复制。

自定义不可变类时,为什么 getXXX() 返回的集合还要再包装一次

即使你把字段声明为 private final List data; 并只提供 getItems(),如果直接返回 data,调用方仍可能 cast 成 ArrayList 并修改——这会破坏封装性。

事情说清了就结束。关键不是记住哪些方法抛异常,而是每次拿到一个 List 时,先问一句:它的生命周期和所有权归谁?是不是我亲手 new 出来的?
本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。