如何解决Java中调用add方法抛出的UnsupportedOperationException?
问题原因与修复方案
问题根源
异常java.lang.UnsupportedOperationException来自ImmutableCollections$AbstractImmutableCollection.add,说明你的Entity类中fields成员是一个不可变集合(比如通过List.of()、Collections.unmodifiableList()创建的只读集合)。而addMappedListField方法仅在fields为null时才创建可变的ArrayList,当fields已经是不可变集合时,直接调用add就会触发该异常。
修复方案
方案1:修改addMappedListField方法,强制确保fields为可变集合
修改方法内的集合初始化逻辑,无论fields是否为null,都将其转换为可变的ArrayList:
public void addMappedListField(String collector) { EntityField field = new EntityField(collector.toLowerCase(), collector, RelationEnum.MANY_TO_ONE); field.setRealType(collector); // TODO: Fix this error // 确保fields是可变集合:如果是null或不可变集合,替换为新的ArrayList if (fields == null || !(fields instanceof ArrayList)) { fields = new ArrayList<>(fields != null ? fields : Collections.emptyList()); } this.fields.add(field); }
方案2:从源头初始化可变集合
检查Entity类中fields的初始化代码,确保一开始就使用可变集合,避免使用不可变集合创建方式:
// 正确的初始化方式(可变) private List<EntityField> fields = new ArrayList<>(); // 错误的初始化方式(不可变,需要替换) // private List<EntityField> fields = List.of(); // private List<EntityField> fields = Collections.unmodifiableList(new ArrayList<>());
补充说明
从异常栈来看,核心问题集中在Entity.fields的可变性上,优先处理上述两种方案即可解决当前报错。如果后续发现entities列表本身是不可变的,再针对性调整该集合的初始化逻辑。
内容的提问来源于stack exchange,提问作者Hamza Bousalih
相关产品推荐
相关产品推荐

