gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:10:43 24 4
gpt4 key购买 nike

我的代码导致 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com