【问题标题】:How to fix a java.util.ConcurrentModificationException如何修复 java.util.ConcurrentModificationException
【发布时间】:2013-11-08 18:04:00
【问题描述】:

我的代码导致我不知道如何修复它的错误。我尝试输入打印语句,但它甚至不会那么远。发生错误

这是确切的错误

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 循环

【问题讨论】:

标签: java for-loop hashmap


【解决方案1】:

如果您想在迭代元素时从列表中添加或删除元素,可以使用ListIterator。这是假设您的 orders 是一个列表

所以,你的代码看起来像这样--

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()
}

【讨论】:

  • 在我的情况下,我会删除吗?我每次都在创建一个新的 Order 实例?
  • 如果orders是一个List,那么你可以使用ListIteratoradd方法
【解决方案2】:

您试图在迭代其内容时操纵sample 的内容。要解决此类问题,请使用不可变集合,或假装它们是。

您想要做的是,在迭代 samples 时,用您想要的集合构建另一个集合,并修改这个另一个集合而不是原来的集合。

【讨论】:

  • 我认为他在样本循环中有两个问题samplesorders,他也在更改订单的内容。
  • 是的,我希望 Java 中的默认集合是不可变的,以防止这种行为......(就像在 Scala 中一样) - 我们需要更多函数式编程概念到我们的 OO 方式中 :)
  • 要解决此问题,我是否只需将 orders.add(order) 放在第二个 forloop 之外但在第一个第一个循环内?这样能解决吗?
  • 还是我必须从头开始重建整个事情
  • 你必须重写它:你不能在迭代集合时修改它!如果您只有一个集合(订单),问题仍然存在
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 2012-07-09
  • 2014-05-18
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
相关资源
最近更新 更多