Java 从成员列表中删除时,创建新对象(扩展线程)会导致UnsupportedOperationException<;E>;
我有一个Java 从成员列表中删除时,创建新对象(扩展线程)会导致UnsupportedOperationException<;E>;,java,list,foreach,Java,List,Foreach,我有一个MyObject()扩展线程,它在run()方法中为自己创建了一个新的MyObject。 这个对象有一个列表作为成员,在某些条件下我从中删除 创建新对象时,我会在创建后调用start(),以启动它的run方法。但一旦我生成新对象,它就会抛出一个 Exception in thread "Thread-1" java.lang.UnsupportedOperationException at java.base/java.util.ImmutableCollections.uoe(Immu
MyObject()扩展线程
,它在run()
方法中为自己创建了一个新的MyObject
。
这个对象有一个列表
作为成员,在某些条件下我从中删除
创建新对象时,我会在创建后调用start()
,以启动它的run方法。但一旦我生成新对象,它就会抛出一个
Exception in thread "Thread-1" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:73)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.remove(ImmutableCollections.java:80)
at mypackage.MyMainClass.MyObject.run(MyObject.java:87) <- here I remove from my List
线程“thread-1”java.lang.UnsupportedOperationException中的异常
位于java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:73)
位于java.base/java.util.ImmutableCollections$AbstractImmutableCollection.remove(ImmutableCollections.java:80)
在mypackage.MyMainClass.MyObject.run(MyObject.java:87)中,@Joachim Sauer指出了这个问题:
SomeType.getList
返回一个不支持结构修改(或者根本不支持修改)的List
实现。有关类似问题,请参见(使用add()
,但问题源和解决方案非常相似)
使用的列表是使用不可变的
list.of()
创建的。即使在修复UnsupportedOperationException
时,从列表中删除元素的代码也会抛出ConcurrentModificationException
,因为在使用迭代器遍历列表时,您在不使用迭代器的情况下修改列表
for (SomeType sometype : list) { // this creates iterator behind the scene
if (somecondition) {
// toDelete is always in that List
list.remove(toDelete); // this modifies the list and makes iterator throw ConcurrentModificationException
}
}
请做一个。显示您的代码。你这么说是没有道理的copy@Seelenvirtuose我添加了一个精简的示例。我怀疑for循环是所有这些的原因。错误说明了一切:您试图从一个不可变的列表中删除一个元素,因此不支持删除。您可能希望在构造函数中创建
st.getList()
的可变副本。SomeType.getList
返回不支持结构修改(或者根本不支持修改)的List
实现。有关类似问题,请参见(使用add()
,但问题源和解决方案非常相似)。
for (SomeType sometype : list) { // this creates iterator behind the scene
if (somecondition) {
// toDelete is always in that List
list.remove(toDelete); // this modifies the list and makes iterator throw ConcurrentModificationException
}
}