在ArrayList中的foreach循环内添加时,出现ConcurrentModification

我正在尝试通过数组列表使用foreach循环,但是当我使用它时,它会给我带来错误,但是当我使用普通的for循环时,它可以正常工作,这可能是什么问题?


代码在这里:


for (Pair p2 : R) {

    if ((p2.getFirstElm() == p.getSecondElm()) && (p2.getFirstElm() != p2.getSecondElm())) 

        R.add(new Pair (p.getFirstElm(), p2.getSecondElm()));

    else if ((p2.getSecondElm() == p.getFirstElm()) && (p2.getFirstElm() != p2.getSecondElm())) 

        R.add(new Pair (p2.getFirstElm(), p.getSecondElm()));


    // else

    // There are no transitive pairs in R.

}

这是无效的循环,这是有效的循环:


for (int i = 0; i < R.size(); i++) {

    if ((R.get(i).getFirstElm() == p.getSecondElm()) && (R.get(i).getFirstElm() != R.get(i).getSecondElm())) 

        R.add(new Pair (p.getFirstElm(), R.get(i).getSecondElm()));

    else if ((R.get(i).getSecondElm() == p.getFirstElm()) && (R.get(i).getFirstElm() != R.get(i).getSecondElm())) 

        R.add(new Pair (R.get(i).getFirstElm(), p.getSecondElm()));

    //else

    //  There are no transitive pairs in R.

}

使用foreach循环时出现的错误是:


Exception in thread "main" java.util.ConcurrentModificationException

    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)

    at java.util.AbstractList$Itr.next(Unknown Source)  

    at set.problem.fourth.PoSet.makeTransitive(PoSet.java:145)  

    at set.problem.fourth.PoSet.addToR(PoSet.java:87)

    at set.problem.fourth.PoSetDriver.typicalTesting(PoSetDriver.java:35)

    at set.problem.fourth.PoSetDriver.main(PoSetDriver.java:13)


喵喔喔
浏览 681回答 3
3回答

长风秋雁

引擎盖下,该for-each循环在Java使用的Iterator用于遍历集合(请参阅本文章进行了详细说明。)和迭代器都将抛出ConcurrentModificationException,如果你修改集合在遍历它,看到这个帖子。

倚天杖

问题是您正在循环的第一行中执行R.add()。在第一种情况下,您需要向arraylist打开一个迭代器。当您执行添加操作然后尝试再次进行迭代时,迭代器会注意到您下面的数据结构已更改。对于for look,每次添加一个新元素都不会出现并发修改问题,尽管随着添加更多元素而大小会发生变化。要解决此问题,您可能需要添加到一个临时位置,然后在循环后添加该位置,或者制作一份初始数据的副本并添加到原始位置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java