【问题标题】:How can I solve java.util.HashMap error? [duplicate]如何解决 java.util.HashMap 错误? [复制]
【发布时间】:2014-09-20 22:18:56
【问题描述】:

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

我应该在某些语句或所有语句周围使用锁定吗?不知道真正的问题限制了寻找解决方案。无论如何,谢谢

【问题讨论】:

  • 使用java.util.Iterator,实际上不是HashMap error。为什么不像你的错误所说的那样首先使用java.util.ConcurrentModificationException 谷歌?

标签: java


【解决方案1】:

我认为您在迭代 holder 键时不能调用 holder.remove()。相反,您可以使用类似

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

【讨论】:

  • 如果我对the docs的理解正确,他也许还可以通过keys.iterator()为keySet获取一个Iterator,迭代它并在需要时直接调用.remove()从中删除一个值及其支持图 (= holder)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2021-10-11
    • 2020-07-07
    • 2021-08-04
    相关资源
    最近更新 更多