java.lang.UnsupportedOperationException: Immutable list cannot be modified
ID: java/unsupported-operation-exception-immutable-list
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Java 9 | active | — | — | — |
| Java 11 | active | — | — | — |
| Java 17 | active | — | — | — |
| Java 21 | active | — | — | — |
Root Cause
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.
generic中文
尝试修改通过 List.of()、Collections.unmodifiableList() 或 Stream.toList() 等方法创建的不可变集合,这些集合不支持 add、remove 或 set 操作。
Official Documentation
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/UnsupportedOperationException.htmlWorkarounds
-
95% success If modification is needed, create a mutable copy of the immutable list using the ArrayList constructor, then modify the copy.
If modification is needed, create a mutable copy of the immutable list using the ArrayList constructor, then modify the copy.
-
90% success Use Stream.collect(Collectors.toList()) to create a mutable list instead of Stream.toList() (which returns an immutable list in Java 16+).
Use Stream.collect(Collectors.toList()) to create a mutable list instead of Stream.toList() (which returns an immutable list in Java 16+).
-
90% success If the list is returned from a library and you must modify it, wrap it in a new ArrayList immediately after receiving it.
If the list is returned from a library and you must modify it, wrap it in a new ArrayList immediately after receiving it.
中文步骤
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.
Dead Ends
Common approaches that don't work:
-
90% fail
Catching and ignoring the exception does not fix the logic; the modification is silently skipped, leading to data inconsistency.
-
100% fail
Adding @SuppressWarnings does not change the runtime behavior; the exception still occurs.
-
60% fail
Using ArrayList constructor on the immutable list creates a mutable copy, but if the code continues to use the original reference, the error persists.