使用iterator和iterator.remove()时出现ConcurrentModificationException

private int checkLevel(String bigWord, Collection dict, MinMax minMax) { /*value initialised to losing*/ int value = 0; if (minMax == MinMax.MIN) value = 1; else value = -1; boolean go = true; Iterator iter = dict.iterator(); while(iter.hasNext()) { String str = iter.next(); Collection inds = naiveStringSearch(bigWord, str); if(inds.isEmpty()) { iter.remove(); } for (Integer i : inds) { MinMax passin = minMax.MIN; if (minMax == MinMax.MIN) passin = minMax.MAX; int value2 = checkLevel(removeWord(bigWord, str, i), dict, passin); if (value2 == -1 && minMax == minMax.MIN) { value = -1; go = false; } if (value2 == 1 && minMax == minMax.MAX) { value = 1; go = false; } } if (go == false) break; } return value; } 

错误:

 Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:810) at java.util.HashMap$KeyIterator.next(HashMap.java:845) at aStringGame.Main.checkLevel(Main.java:67) at aStringGame.Main.test(Main.java:117) at aStringGame.Main.main(Main.java:137) 

这有什么问题?

某处某处正在修改dict 。 我怀疑它可能会在这个电话中发生:

 int value2 = checkLevel(removeWord(bigWord, str, i), dict, passin); ^^^^ 

编辑基本上,会发生的事情是对checkLevel()的递归调用通过另一个迭代器修改dict 。 这使得外部迭代器的快速失败行为成为可能。

在使用迭代器迭代它时,您无法修改集合。

您尝试调用iter.remove()会破坏此规则(也可能是您的removeWord方法)。

如果使用ListIterator进行迭代,则可以在迭代时修改List。

您可以将Set转换为List并使用List迭代器:

 List tempList = new ArrayList(dict); ListIterator li = tempList.listIterator(); 

另一种选择是在迭代时跟踪要删除的元素。

例如,您可以将它们放在Set中。

然后,您可以在循环后调用dict.removeAll()

例:

 Set removeSet = new HashSet(); for (String s : dict) { if (shouldRemove(s)) { removeSet.add(s); } } dict.removeAll(removeSet); 

for each循环使用a时for each不允许修改在循环内迭代的Collection 。 如果需要修改它,请使用经典的for循环

这在所有Collections类中都很常见。 例如,TreeSet中的条目使用failfast方法。

这个类的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候修改了set,​​除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException。 因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险。

http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html