当前位置: 首页 > 知识库问答 >
问题:

ConcurrentModificationException*After*修改ArrayList

东方化
2023-03-14

我正在处理一些代码,在测试过程中,它开始抛出一个ConcurrentModificationException。经过一番研究,让我困惑的是,我在迭代时并没有从列表中添加或删除。我确实会对列表进行迭代,但这是在我添加到列表之后。为了更清楚,下面是代码的注释版本:

        File f = fc.getSelectedFile();
        ConfigurationManager manager = new ConfigurationManager(f);
        //The next line uses the same thread to get all Host objects from the file
        ArrayList<Host> configHosts = manager.getAllHosts();
        //Add the found hosts to a (previously established) ArrayList
        hosts.addAll(configHosts);
        for(Host h : hosts) { //Exception thrown points to this line.
            //This reads values from the Host object and puts them in a JTable.
            //No modification is done to the object, it is just read from.
            this.updateTable(h);
        }

我不确定这段代码怎么可能抛出ConcurrentModificationException,除非addAll()在不同的线程中运行(然后在添加主机时调用updateTable())。但除了这个,我不知道我在做什么这是不合适的。

共有1个答案

阳兴文
2023-03-14

我在代码中发现了这个错误。评论者是对的;updateTable()是(间接)责任。有一个特殊情况,某些主机将被从全局字段中删除,我的测试数据必须符合这个特殊情况。我没有删除问题,因为我相信我的特定错误是有价值的。简而言之,如果您获得ConcurrentModificationException,请检查以下内容:

  • 在迭代列表时,是否尝试从ArrayList中删除/添加项?
  • 您确定读取ArrayList的代码没有副作用(即在任何情况下都不会修改列表)吗(这是我的问题)?
  • 您是否在多线程环境中工作,在迭代过程中可以修改此ArrayList(如果是,您可能希望synchronize循环)?
 类似资料:
  • 问题内容: 我在下面有此代码,并且通过执行以下行来获取ConcurrentModificationException: 代码: 堆栈是: 恰好在foreach行上: 我不明白为什么会发生此错误,因为我没有修改列表。 问题答案: 要知道,是 不是抄袭 收集数据,但只有包装原始集合在一个特殊的包装。因此,如果您修改原始集合,则会出现此错误。 如果要创建真正独立的不可修改的集合实例:

  • 选择视图布局和共享视图设置 “合成”面板可以同时显示一个、两个或四个视图。默认情况下,查看器选项(例如网格和标尺)只会影响当前活动的视图。 要选择视图布局,请从“合成”面板底部的“选择视图布局”菜单中选择选项。 要滚动查看视图布局,请将指针置于“选择视图布局”菜单上并滚动鼠标滚轮。 要对当前布局中的所有视图应用视图设置,请从“选择视图布局”菜单中选择“共享视图选项”。按住 Ctrl 键 (Wind

  • 问题内容: ConcurrentModificationException:当不允许对对象进行并发修改时,检测到该对象的并发修改的方法可能会抛出此异常。 上面是javadoc中的ConcurrentModificationException定义。 所以我尝试测试以下代码: 代码很简单。10个线程从arraylist对象中删除该元素。确保多个线程访问一个对象。但它运行正常。没有异常被抛出。为什么?

  • 问题内容: 我正在尝试按时间范围的开始时间排序列表(用开始时间和结束时间表示为Time []数组)。我正在尝试使用以下嵌套循环来做到这一点: 但它在行上抛出了一个(顶部的那个)。我以前从未见过这种例外情况,有人可以向我解释它的含义和原因。 我也愿意为此提出更好的算法建议。 问题答案: workingList.remove(compareTo); 您在迭代时正在修改集合。 您应该使用类似: 也有一些

  • 我有MultivalueMap和TreeMap,它们都有String类型的键值。 我希望将MultivalueMap中的任何键更改为TreeMap中的键。 这是我的代码,为什么我会得到ConcurrentModificationException以及如何解决它?

  • 说明 支付宝境外到店支付-修改商户二维码 官方文档:https://global.alipay.com/service/merchant_QR_Code/34 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\ModifyMerchantQR\Request 属性 名称 类型 说明 $service string 接口名称 $qrcod