Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LinkedHashMap->;java.util.ConcurrentModificationException_Java_Linkedhashmap_Concurrentmodification - Fatal编程技术网

LinkedHashMap->;java.util.ConcurrentModificationException

LinkedHashMap->;java.util.ConcurrentModificationException,java,linkedhashmap,concurrentmodification,Java,Linkedhashmap,Concurrentmodification,执行以下代码时,我收到ConcurrentModificationException: public void refreshAvailableCaseSettings() throws Exception { //getAvailableCases() returns reference to the instance variable LinkedHashMap<Integer, CaseSetting> cases = getAvaila

执行以下代码时,我收到ConcurrentModificationException:

    public void refreshAvailableCaseSettings() throws Exception {
        //getAvailableCases() returns reference to the instance variable
        LinkedHashMap<Integer, CaseSetting> cases = getAvailableCases();
        /* java.util.ConcurrentModificationException even after trying entryset()
        for(Map.Entry<Integer, CaseSetting> entry : cases.entrySet()){
            entry.getValue().refresh(false);
        }
        */

        // java.util.ConcurrentModificationException
        Iterator casesIterator = cases.values().iterator();
        while (casesIterator.hasNext()) {
            CaseSetting caseSetting = casesIterator.next();
            //refresh() updates caseSetting state by getting setting info from DB
            caseSetting.refresh(false);
        }
    }

我不是通过添加或删除元素来修改地图。请帮助我理解这里的问题。

刷新功能是什么?据我所知,您之所以获得这些,只是因为您在迭代时修改了HashMap
,
当我在地图上放东西的时候,经常会出现这些错误,这意味着尺寸在增加


您还需要对所有内容提出疑问,例如
caseseting
class

使用迭代器的一般合同如下:

当集合上的迭代器正在进行时,不能修改基础集合

可以对集合的元素执行任何操作,但不能触摸集合本身

您将获得一个
ConcurrentModificationException
,因为
循环中的一部分代码正是这样做的,它更改了基础集合


标准方法是(A)创建集合的新副本并在该只读副本上迭代,或(b)将更改放入单独的集合。

Where do
getAvailableCases()获取其返回值?是你写的代码吗?它看起来像
getAvailableCases()
正在返回对映射的引用,该映射是从该代码中的某个地方修改的。您是否也可以发布CaseSetting类..@JerryJeremiah:您是正确的getAvailableCases()返回对实例变量的引用。我不希望refresh更改集合-我认为它只是更新了元素。但是,如果getAvailableCases()返回对映射的引用,则在您尝试刷新映射时,其他线程可能正在向映射添加项目。唯一可以知道的方法是,它的所有代码。refresh()函数从数据库获取caseSetting的更新状态。
   java.util.ConcurrentModificationException
    at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
    at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:752)
    at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:750)