我有一个MyObject() extends Thread
,它会以MyObject
方法创建自己的新run()
。该对象具有List<E>
作为成员,在某些情况下我从中删除该对象。
I在创建新对象时,我随后调用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
示例:
public class MyObject extends Thread {
List<SomeType> list = new ArrayList<SomeType>();
SomeType st;
public MyObject(SomeType st) {
this.st = st;
// returns a List of SomeType
list = st.getList();
}
@Override
public void run() {
while(!done) {
SomeType toDelete;
if (condition) {
toDelete = st.getToDelete();
}
// Checks for null etc are done and not important
for (SomeType sometype : list) {
if (somecondition) {
// toDelete is always in that List
list.remove(toDelete)
}
}
if (lastcondition) {
MyObject newObject = new MyObject(this.st);
newObject.start();
}
}
}
}
为什么会出现此错误?由于列表是对象的每个实例的成员,所以为什么它对于新线程是不可变的,但对于我的初始对象却不可变?
问题由@Joachim Sauer指出:使用List.of()
创建的列表是不可变的。