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

Java ArrayList的ConcurrentModificationException

宰父俊民
2023-03-14
问题内容

我有以下代码

private String toString(List<DrugStrength> aDrugStrengthList) {
    StringBuilder str = new StringBuilder();
        for (DrugStrength aDrugStrength : aDrugStrengthList) {
            if (!aDrugStrength.isValidDrugDescription()) {
                aDrugStrengthList.remove(aDrugStrength);
            }
        }
        str.append(aDrugStrengthList);
        if (str.indexOf("]") != -1) {
            str.insert(str.lastIndexOf("]"), "\n          " );
        }
    return str.toString();
}

当我尝试运行它时,我得到了ConcurrentModificationException,即使代码在同一线程中运行,没有人能解释为什么会发生吗?我该如何避免呢?


问题答案:

如果使用“ for each”循环浏览列表,则无法从列表中删除。你可以使用Iterator。更换:

for (DrugStrength aDrugStrength : aDrugStrengthList) {
    if (!aDrugStrength.isValidDrugDescription()) {
        aDrugStrengthList.remove(aDrugStrength);
    }
}

带有:

for (Iterator<DrugStrength> it = aDrugStrengthList.iterator(); it.hasNext(); ) {
    DrugStrength aDrugStrength = it.next();
    if (!aDrugStrength.isValidDrugDescription()) {
        it.remove();
    }
}


 类似资料:
  • 问题陈述:为以下场景设计系统: 1.物料列表包含多个物料的物料编码、名称、费率和数量。 每当在列表中添加新项目时,都要检查项目编码的唯一性。用新产品的价格注册一个新产品。 项目的时间比率可能会更改。 每当发出或接收一个项目时,检查该项目的存在性并更新数量。 出库时,还要检查数量的可用性。 用户可能还想知道一个项目的价格/数量。 查找多少项目的成本超过给定金额。金额将是一个参数。 请记住,如果给出了

  • 问题内容: 我使用迭代器遍历一个集合,如下所示: 但是在下面的行中,我得到了ConcurrentModificationException 当我不进行任何更改时,为什么会发生这种情况? 非常感谢 编辑-堆栈跟踪: 问题答案: 您必须修改列表之一: 在方法中的迭代器内部,而无需使用迭代器上的或方法;要么 在另一个线程中 因此,您的例外是预期的行为。从该文档,如果你有一个线程遍历列表: 如果在创建迭代

  • 我希望下面的代码中有,但它运行良好。 根据JavaDoc for: 这个类的所有“Collection view Methods”返回的迭代器都是快速失败的:如果在迭代器创建后的任何时候,以任何方式(除了通过迭代器自己的remove方法)修改了映射,则迭代器将抛出一个ConcurrentModificationException。 因此,由于我在获得之后修改了,所以我应该得到。为什么不扔?

  • 我正在使用面临的问题是,当我运行下面的代码时,我得到了。 据我所知,代码应该毫无例外地终止。 有人能帮我理解为什么我会得到这个例外吗。

  • 所有订阅操作都使用以下内容: 所有取消订阅操作都使用以下内容: 和通知者:

  • 问题内容: 我在下面有此代码,并且通过执行以下行来获取ConcurrentModificationException: 代码: 堆栈是: 恰好在foreach行上: 我不明白为什么会发生此错误,因为我没有修改列表。 问题答案: 要知道,是 不是抄袭 收集数据,但只有包装原始集合在一个特殊的包装。因此,如果您修改原始集合,则会出现此错误。 如果要创建真正独立的不可修改的集合实例: