java.lang.UnsupportedOperationException:不可变列表无法修改
java.lang.UnsupportedOperationException: Immutable list cannot be modified
ID: java/unsupported-operation-exception-immutable-list
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| Java 9 | active | — | — | — |
| Java 11 | active | — | — | — |
| Java 17 | active | — | — | — |
| Java 21 | active | — | — | — |
根因分析
尝试修改通过 List.of()、Collections.unmodifiableList() 或 Stream.toList() 等方法创建的不可变集合,这些集合不支持 add、remove 或 set 操作。
English
An attempt was made to modify a collection that was created as immutable (e.g., via List.of(), Collections.unmodifiableList(), or Stream.toList()), which does not support add, remove, or set operations.
官方文档
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/UnsupportedOperationException.html解决方案
-
If modification is needed, create a mutable copy of the immutable list using the ArrayList constructor, then modify the copy.
-
Use Stream.collect(Collectors.toList()) to create a mutable list instead of Stream.toList() (which returns an immutable list in Java 16+).
-
If the list is returned from a library and you must modify it, wrap it in a new ArrayList immediately after receiving it.
无效尝试
常见但无效的做法:
-
90% 失败
Catching and ignoring the exception does not fix the logic; the modification is silently skipped, leading to data inconsistency.
-
100% 失败
Adding @SuppressWarnings does not change the runtime behavior; the exception still occurs.
-
60% 失败
Using ArrayList constructor on the immutable list creates a mutable copy, but if the code continues to use the original reference, the error persists.