我有以下代码:
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行上: 我不明白为什么会发生此错误,因为我没有修改列表。 问题答案: 要知道,是 不是抄袭 收集数据,但只有包装原始集合在一个特殊的包装。因此,如果您修改原始集合,则会出现此错误。 如果要创建真正独立的不可修改的集合实例: