java - 如何重新设计方法以使其发挥作用

标签 java list for-loop hashmap set

我的代码导致 java.util.ConcurrentModificationException 错误。这是以下代码。

这是确切的错误:

java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:894)
        at java.util.HashMap$KeyIterator.next(HashMap.java:928)
        at ca.on.oicr.pinery.lims.gsle.GsleClient.getOrders(GsleClient.java:720)

第720行是第二个for循环

我之前发布过这个问题,并被告知“您在循环订单元素的循环内添加订单,这就是导致异常的原因。不要修改您在循环内循环的集合. sample 也是如此”。我明白我要重新构建这个方法并收到以下建议。

ListIterator<Order> it = orders.listIterator();

while ( it.hasNext() ) {
      Order ord = it.next();

      if ( ) // some condition
        it.remove(); // This wil remove the element that we just got using the next() method
      if ( ) // some other condition
        it.add(new Order()); // THis inserts the element immediately before the next call to next()
}

现在我陷入了如何在使用迭代方法时添加样本和顺序的问题,因为你会通过一个集合进行不同的迭代,我假设我会使用 for 循环。

这是我对如何更改以避免获得 java.util.ConcurrentModificationException 感到困惑的部分。

f

到目前为止我已经到达这里了。

  java.util.ListIterator<Order> it = orders.listIterator();
  while (it.hasNext()) {
     it.next().getId();
     if (sampleOrderMap.containsKey((it.next().getId())))
     {
        Set<OrderSample> samples = sampleOrderMap.get(it.next().getId());

     }

  }`

我只是不知道如何以不会得到 ConcurrentModificationException 的方式放入其余部分

最佳答案

来自 Java 文档:

当不允许进行对象的并发修改时,方法可能会抛出 ConcurrentModificationException。 例如,通常不允许一个线程修改 Collection,而另一个线程正在迭代它。一般来说,在这些情况下迭代的结果是不确定的。如果检测到此行为,某些 Iterator 实现(包括 JRE 提供的所有通用集合实现)可能会选择抛出此异常。执行此操作的迭代器称为快速失败迭代器,因为它们会快速而干净地失败,而不是在未来不确定的时间冒任意、非确定性行为的风险。

请注意,此异常并不总是表明对象已被不同的线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。

请注意,无法保证快速失败行为,因为一般来说,在存在不同步并发修改的情况下不可能做出任何硬保证。快速失败操作会尽力抛出 ConcurrentModificationException。因此,编写依赖于此异常来确保其正确性的程序是错误的:ConcurrentModificationException 应该仅用于检测错误。

要解决此问题,您可以创建一个临时集合以添加到您正在迭代的集合之外的集合中。

然后,完成迭代后,您可以使用orders.AddAll(tempCollection) 添加新项目。

关于java - 如何重新设计方法以使其发挥作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664497/

相关文章:

java - Android将文本文件(.txt)读入字符串数组

窗口命令 : List files in dir & subdir WITHOUT given extensions

PHP 获取扑克的所有独特棋盘结果

python-3.x - 为什么python的for循环对于大输入如此非线性?

java - 如何保证camel记录的是ASCII文本而不是小数?

java - 使用多个并发线程执行一组测试方法

java - 继承和 LSP

python - 从文本文件 PYTHON 填充字典

python - 如何在Python中将多个列表压缩到嵌套字典中

c++ - 'for' 循环内的后增量和预增量产生相同的输出