Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从成员列表中删除时,创建新对象(扩展线程)会导致UnsupportedOperationException<;E>;_Java_List_Foreach - Fatal编程技术网

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
    } 
}