java runtime_error ai_generated true

java.lang.UnsupportedOperationException: Immutable list cannot be modified

ID: java/unsupported-operation-exception-immutable-list

Also available as: JSON · Markdown · 中文
95%Fix Rate
85%Confidence
1Evidence
2024-02-14First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
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.html

Workarounds

  1. 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.
  2. 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+).
  3. 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.

中文步骤

  1. If modification is needed, create a mutable copy of the immutable list using the ArrayList constructor, then modify the copy.
  2. Use Stream.collect(Collectors.toList()) to create a mutable list instead of Stream.toList() (which returns an immutable list in Java 16+).
  3. 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:

  1. 90% fail

    Catching and ignoring the exception does not fix the logic; the modification is silently skipped, leading to data inconsistency.

  2. 100% fail

    Adding @SuppressWarnings does not change the runtime behavior; the exception still occurs.

  3. 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.