当前位置: 首页 > 面试题库 >

ConcurrentModificationException?

皇甫展
2023-03-14
问题内容

我正在尝试按时间范围的开始时间排序列表(用开始时间和结束时间表示为Time []数组)。我正在尝试使用以下嵌套循环来做到这一点:

            for (Time[] span : workingList){
            Time[] compareTo = workingList.get(0);

                for (Time[] inSpan : workingList){
                    if (inSpan[0].before(compareTo[0])){
                    compareTo = inSpan;
                    }
                }
            workingList.remove(compareTo);
            toReturn.add(compareTo);
        }

    }

但它java.util.ConcurrentModificationException在行上抛出了一个for (Time[] span : workingList)(顶部的那个)。我以前从未见过这种例外情况,有人可以向我解释它的含义和原因。

我也愿意为此提出更好的算法建议。


问题答案:

workingList.remove(compareTo);

您在迭代时正在修改集合。

您应该使用类似:

ListIterator<Time[]> it = workingList.listIterator();

while (it.hasNext()) {
  Time[] time = it.next();
  ..
  it.remove();
}

也有一些方法不使用列表迭代器,但这似乎更正确。



 类似资料:
  • 问题内容: 我想删除所有其中没有键的项目。看一下我的代码: 我收到了。为什么?流不是并行的。最优雅的方法是什么? 问题答案: @Eran已经解释了如何更好地解决此问题。我将解释为什么会发生。 发生这种情况是因为您正在修改流源。您可能是或或其他非并行地图。假设它是一个。每个流都有的支持。如果分隔符没有和特征,那么,如文档所述: 绑定后,如果发现结构上的干扰,分离器应尽力而为。执行此操作的拆分器称为

  • 问题内容: 有什么不同之处与使得迭代器不会引发异常而引发异常?最后,两者都在修改集合大小。 请在这里忽略多线程。我只是在谈论一个for-each循环和一个迭代器循环。据我所知,for-each循环仅在内部创建迭代器。 我很困惑。 问题答案: 不会抛出,因为这是在迭代时修改集合的 允许 方式。这是什么的Javadoc的说: 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()

  • 问题内容: 根据运行时错误消息,异常发生在下一行; 是具有构造函数和重载构造函数的类,其中包含有关数据库中每种病毒的特定信息,例如; 字符串vName 字符串vDefinition 重载 具有标记化定义的数组(以xLength组分隔) 具有LCS令牌的阵列 有等级浮动 类型的是.iterator(),如下所示: 是和ArrayList类型,用于存储病毒对象 (此时为名称和定义), 以便以后使用。

  • 问题内容: 我有一个包含一些键(字符串)和值(POJO)的地图 我想遍历此映射并更改POJO中的某些数据。 我继承的当前代码将删除给定的条目,并在对POJO进行一些更改后将其重新添加。 这不能很好地进行,因为在遍历地图时您不应该修改地图(方法已同步,但ConcurrentModificationException仍然出现) 我的问题是 ,如果我需要遍历地图并更改值,我可以使用的最佳实践/方法是什么

  • 问题内容: 情况1:这不会引起?。谁能告诉我为什么这不会导致ConcurrentModificationException。 情况2:这是由于我尝试访问AsyncThread中的线程不安全的人员列表。我可以使我的“人员列表”实现是线程安全的,并且应该可以运行。 谁能解释我到底发生了什么。我无法理解这是如何解决问题的。 案例2是否将实现从更改为推荐? 添加例外: 05-28 20:34:21.073

  • 问题内容: 以下Java代码按预期抛出: 但是以下示例仅在的内容上有所不同,执行时没有任何例外: 打印输出“ [lalala]”。为什么在第一个示例执行时第二个示例却不抛出? 问题答案: 简短答案 因为不能保证迭代器的快速失败行为。 长答案 之所以会出现此异常,是因为除非通过迭代器,否则无法在迭代集合时操作集合。 坏: 好: 现在转到“为什么”:在上面的代码中,请注意如何执行修改检查- 删除操作将

  • 问题内容: 错误: 这是什么问题 问题答案: 某处正在修改。我怀疑它可能在此调用内发生: 编辑 基本上,发生的是通过 另一个 迭代器进行的递归修改。这使得外部迭代器的故障快速行为得以解决。 __

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