我知道如果试图通过简单的循环从集合中删除,我会得到这个异常:java.util.ConcurrentModificationException
。但是我正在使用Iterator,它仍然会生成这个异常。你知道为什么和如何解决它吗?
HashSet<TableRecord> tableRecords = new HashSet<>();
...
for (Iterator<TableRecord> iterator = tableRecords.iterator(); iterator.hasNext(); ) {
TableRecord record = iterator.next();
if (record.getDependency() == null) {
for (Iterator<TableRecord> dependencyIt = tableRecords.iterator(); dependencyIt.hasNext(); ) {
TableRecord dependency = dependencyIt.next(); //Here is the line which throws this exception
if (dependency.getDependency() != null && dependency.getDependency().getId().equals(record.getId())) {
tableRecords.remove(record);
}
}
}
}
发布于 2013-06-06 23:01:23
您必须使用iterator.remove()
而不是tableRecords.remove()
只有在使用迭代器中的remove方法时,才能移除要迭代的列表上的项。
编辑:
当您创建迭代器时,它开始计算应用于集合的修改。如果迭代器检测到某些修改是在未使用其方法(或使用同一集合上的另一个迭代器)的情况下进行的,则它不能再保证不会在同一元素上传递两次或跳过一次,因此抛出此异常
这意味着你需要修改你的代码,这样你只需要通过iterator.remove (并且只有一个迭代器)移除项目。
或
创建要删除的项的列表,然后在完成迭代后删除它们。
发布于 2013-06-06 23:01:56
hashset迭代器的约定是,除非通过特定迭代器的remove方法,否则不能从哈希集删除。从dependencyIt
的角度来看,您已经移除了一个项,而不是通过调用它的remove
方法来使其抛出ConcurrentModificationException
。
当它们具有相同的记录id时,您似乎想从您的hashset中删除记录。重写记录的equals
和hashcode
方法以确保具有相同id的记录相等并且具有相同的哈希码,不是更容易吗?(当然,如果这有意义的话)
发布于 2013-06-06 23:06:29
问题是你同时在作用域中有两个迭代器,它们相互“战斗”。解决这个问题的最简单的方法是,如果你找到一个匹配项,就跳出内部循环:
for (Iterator<TableRecord> iterator = tableRecords.iterator(); iterator.hasNext(); ) {
TableRecord record = iterator.next();
if (record.getDependency() == null) {
for (Iterator<TableRecord> dependencyIt = tableRecords.iterator(); dependencyIt.hasNext(); ) {
TableRecord dependency = dependencyIt.next(); //Here is the line which throws this exception
if (dependency.getDependency() != null && dependency.getDependency().getId().equals(record.getId())) {
iterator.remove();
break; // ADD THIS LINE
}
}
}
}
Java Iterator
的目的是在它们的底层容器在没有使用Iterator
进行更改的情况下“快速失败”。您使用的是嵌套迭代器,所以如果继续使用,向其中一个发出的任何remove()
操作都会导致另一个抛出Exception
。因此,如果您需要发出一个remove()
,那么您将需要在“外部”迭代器(您正在做的)上执行该操作,并在之后停止使用第二个迭代器(添加的break
语句就是这样做的)。
https://stackoverflow.com/questions/16965484
复制相似问题