ConcurrentModificationException when using iterator and iterator.remove()

烂漫一生 提交于 2019-12-01 09:19:22

Something somewhere is modifying dict. I suspect it might be happening inside this call:

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

edit Basically, what happens is that the recursive call to checkLevel() modifies dict through another iterator. This makes the outer iterator's fail-fast behaviour to kick in.

You can't modify a Collection while you're iterating over it with an Iterator.

Your attempt to call iter.remove() breaks this rule (your removeWord method might, too).

You CAN modify a List while iterating IF you use a ListIterator to iterate.

You can convert your Set to a List and use a List iterator:

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

Another option is to keep track of the elements you want to remove while iterating.

You could place them in a Set, for example.

You could then call dict.removeAll() after your loop.

Example:

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

When using a for each loop you are not allowed to modify the Collection you are iterating inside the loop. If you need to modify it, use a classic for loop

This is a common occurance in all Collections classes. For instance the entry in TreeSet uses failfast method.

The iterators returned by this class's iterator method are fail-fast: if the set is modified at any time after the iterator is created, in any way except through the iterator's own remove method, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!