如何修复错误'并发修改例外'来自我的代码

时间:2015-10-13 21:30:26

标签: java for-loop arraylist

我尝试运行for循环,但由于allWords为空,因此无法运行。因此我添加了第一个if语句,因此allWorlds将至少有一个项目,因此循环将运行。循环现在运行,但我得到:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)

一些谷歌搜索告诉我,这是因为我尝试在使用时更改ArrayList(?)。我想知道是否有一个简单的修复,或者我是否必须重写代码。提前谢谢。

代码:

private void addWord(String word){

    if(allWords.isEmpty()){  //allWords defined above.
        allWords.add(word);
    }

    for (String check : allWords){

        if (!check.equalsIgnoreCase(word)){
            allWords.add(word);
        }
        else if(check.equalsIgnoreCase(word)){
            System.out.println("This word is a duplicate.");
        }
        else{
            System.out.println("Something went wrong.");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您正在逐步执行for循环中的项目 - 当您在执行此操作时向列表中添加内容时会发生什么? Java不知道如何处理它,因此抛出ConcurrentModificationException异常。

解决方案?在for循环中使用数组时,请不要弄乱阵列。

一个解决方案(这不是唯一的解决方案)是创建第二个数组,以便在运行for循环时暂时保存要添加的项目,然后返回并添加这些项目当你完成了。

但是,我怀疑你上面的代码片段中的逻辑有错误。它的编写方式,应该多次添加word。我想你想要的是一个布尔标志:

  • 在开始false循环
  • 之前将标记设置为for
  • 如果您在迭代单词数组时找到word,请将其设置为true并退出for循环
  • 完成for循环后,检查你的旗帜;如果它是false,那么添加你的单词(因为你没有在数组中找到它)。

此外,if...else if...else是多余的:equalsIgnoreCase只能返回truefalse,因此没有第三种选择,else永远不会被点击

答案 1 :(得分:1)

您的ArrayList正在使用中,因为您正在迭代它。我建议你为临时数据制作第二个列表

所以基本上是这样的:

List<String> tempList = new ArrayList<String>();
.....
if (!check.equalsIgnoreCase(word)){
    tempList.add(word);
}
.....