我尝试运行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.");
}
}
}
答案 0 :(得分:1)
您正在逐步执行for
循环中的项目 - 当您在执行此操作时向列表中添加内容时会发生什么? Java不知道如何处理它,因此抛出ConcurrentModificationException
异常。
解决方案?在for
循环中使用数组时,请不要弄乱阵列。
一个解决方案(这不是唯一的解决方案)是创建第二个数组,以便在运行for
循环时暂时保存要添加的项目,然后返回并添加这些项目当你完成了。
但是,我怀疑你上面的代码片段中的逻辑有错误。它的编写方式,应该多次添加word
。我想你想要的是一个布尔标志:
false
循环for
word
,请将其设置为true
并退出for
循环for
循环后,检查你的旗帜;如果它是false
,那么添加你的单词(因为你没有在数组中找到它)。此外,if...else if...else
是多余的:equalsIgnoreCase
只能返回true
或false
,因此没有第三种选择,else
永远不会被点击
答案 1 :(得分:1)
您的ArrayList正在使用中,因为您正在迭代它。我建议你为临时数据制作第二个列表
所以基本上是这样的:
List<String> tempList = new ArrayList<String>();
.....
if (!check.equalsIgnoreCase(word)){
tempList.add(word);
}
.....