java - 使用迭代器和 iterator.remove() 时出现 ConcurrentModificationException

标签 java collections iterator concurrentmodification

    private int checkLevel(String bigWord, Collection<String> dict, MinMax minMax)
{
    /*value initialised to losing*/
    int value = 0; 
    if (minMax == MinMax.MIN) value = 1; 
    else value = -1; 


    boolean go = true;

    Iterator<String> iter = dict.iterator();

    while(iter.hasNext())
    {
        String str = iter.next(); 
        Collection<Integer> 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 .这使得外部迭代器的快速失败行为开始生效。

关于java - 使用迭代器和 iterator.remove() 时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13692661/

相关文章:

java - 如何获取 Spring REST 文件下载以返回 404?

java - Tomcat 错误 : The origin server did not find a current representation for the target resource or is not willing to disclose that one exists

java - 由于并发错误,服务器未正常关闭

java - Java 1.5 之前的集合框架实现是通用的吗?

python - 读取csv数据时pythoncode中的StopIteration错误

java - 递归 split 数组方法

ios - 在 swift : Difference between Array VS NSArray VS [AnyObject]

c++ - 在 C++17 中,为什么关联容器有一个 `erase` 成员函数(非 -`const` ) `iterator` ?

java - HashSet 迭代器的问题

java - 设置时间和速度复杂度