如何解决java.util.HashMap错误?

时间:2014-07-29 13:52:56

标签: java

尝试运行应用程序时,我在跟踪中遇到了以下故障。我不承认这个错误背后的原因。它是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);
    }
}

我应该使用锁定某些声明或所有声明吗?不知道真正的问题限制找到解决方案。无论如何,谢谢

2 个答案:

答案 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);

或者,根据HashMapLinkedHashMap Javadocs -

  

如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException

答案 1 :(得分:-1)

迭代时,您无法更改Iterable的内容。相反,您可以将相关值存储在列表中,然后在循环结束后将其删除。

holder.remove()的调用会导致HashMap更改其内容,从而更改其用于循环的键集,从而导致异常。