- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码导致 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/
在 Play 1.x 中有很棒的 play Idealize(和 play eclipsify),它为您最喜欢的 IDE 中的 Play 项目准备了项目文件。 我看到这是在 Play 2.X 中删除的
我是一名优秀的程序员,十分优秀!