尝试运行应用程序时,我在跟踪中遇到了以下故障。我不承认这个错误背后的原因。它是static
关键字的结果,还是一个线程试图修改此代码段中的某些内容?重要的是,我该如何解决这个错误?
失败追踪
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
代码段
// Type of holder is --> HashMap<Integer, HashMap<String, Integer>>
Set<Integer> keys = holder.keySet();
HashMap<String, Integer> temp = new HashMap<String, Integer>();
for(int iter : keys){
temp = holder.get(iter);
if(temp == null || temp.size() == 0){
holder.remove(iter);
}
}
我应该使用锁定某些声明或所有声明吗?不知道真正的问题限制找到解决方案。无论如何,谢谢
答案 0 :(得分:0)
我不认为您在迭代holder.remove()
键时可以调用holder
。相反,你可以用
HashMap<String, Integer> temp = null; // <-- why create one?
List<Integer> toRemove = new ArrayList<>();
for(int iter : keys) {
temp = holder.get(iter);
if (temp == null || temp.size() == 0) {
toRemove.add(iter);
}
}
keys.removeAll(toRemove);
或者,根据HashMap
和LinkedHashMap
Javadocs -
如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的
remove
方法之外,迭代器将抛出ConcurrentModificationException
。
答案 1 :(得分:-1)
迭代时,您无法更改Iterable
的内容。相反,您可以将相关值存储在列表中,然后在循环结束后将其删除。
对holder.remove()
的调用会导致HashMap
更改其内容,从而更改其用于循环的键集,从而导致异常。