当前位置: 首页 > 面试题库 >

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

华佐
2023-03-14
问题内容

我正在尝试通过数组列表使用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)

问题答案:

终使用Immutable集合类并构建新的Immutable集合类,而不要尝试修改单个共享类,但我想使其更加明确。

Guava很好地支持这一点,用于ImmutableList.copyOf()传递数据

用于Iterables.filter()将内容过滤为新的ImmutableList,没有共享的可变状态,这意味着没有并发问题!



 类似资料:
  • 我做了一个程序,利用3类,锦标赛,游戏和俱乐部。我在比赛和俱乐部中的方法都很好,但在冠军联赛的主要方法中,我遇到了问题。我有两个ArrayList,一个是with objects club,另一个是with objects game。在我的主要方法中,我使用while循环和切换用例创建了一个菜单,用户可以1-创建俱乐部,2-创建游戏,3-列出结果,4-注册结果。然而,我的所有案例都有相同的问题:不

  • 我有一个游戏,每隔X秒它就会把内存中改变的值写回我的数据库。当编辑这些值保存的数据时,它们存储在容器(HashMaps和ArrayList)中。 为了简单起见,假设我只有一个容器可以写入数据库: 我的DB写入循环: 我的更新方法: 我是否需要在为dbEntitiesDeletesBacklog HashMap和本摘录中未包含的其他容器“保存到DB”时创建某种锁定机制?我想我需要这样做,因为它会创建

  • 问题内容: 我在Google上搜索的次数越多,我就会越来越困惑。 我从CSV导入了一个长度未知的名称列表以及其他一些详细信息,然后我需要将其转换为Person对象并将其存储在名为people的列表中,该列表是该类Club的实例变量,它的列表成员基本上。 这是非常复杂的事情的非常简化的版本,我需要在while中循环遍历文件,为每行创建对象,然后将其添加到列表集合中。 但是,当我运行代码时,我一直收到

  • 大家好,我正在尝试在while循环中创建foreach循环。在foreach循环中,我试图生成包含div的列表元素,但我有非常奇怪的输出 这是我的密码 这是我的调试器consonle中的一个图像 正如你在图片中看到的,在ul标签中只存在一个li,其余的都在ul /ul. 我的第一个想法是,将div标记放在li标记中是无效的,但如果在文件的顶部使用它,则不是这样 DOCTYPE html PUBLI

  • 问题内容: 我正在尝试使用for循环在数组内创建一个数组-这是我的代码: 不幸的是,这给了我一个 “解析错误:语法错误,意外的T_CONSTANT_ENCAPSED_STRING,预期为’)’” 对于该行: 对于出了什么问题,我有些茫然-非常感谢您的帮助。$ clients是在其他地方定义的,所以这不是问题。 问题答案: 那是无效的语法。您必须首先构建数组的“父”部分。然后使用foreach循环添

  • 问题内容: 我得到以下代码的异常。但是不明白为什么。 我可以使它起作用,但是我试图理解这些概念,因此我将声明更改为以下内容,但也没有起作用。 问题答案: ArrayList索引从0开始(零) 您的数组列表大小为0,并且要在第一个索引处添加String元素。如果不在第0个索引处添加元素,则无法添加下一个索引位置。错了 因此,只需使其成为 或者你可以