LinkedHashMap -> java .util.ConcurrentModificationException - PullRequest
0 голосов
/ 23 апреля 2020

Я получаю 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);
        }
    }

Ошибка:

   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)

Я не изменяю карту, добавляя или удаляя элементы. Пожалуйста, помогите мне понять проблему здесь.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Общий контракт на использование итераторов таков:

Во время выполнения итератора для коллекции базовая коллекция не должна изменяться.

Вы можете делать все, что вы хотите с элементами коллекции, но вы не должны касаться самой коллекции .

Вы получаете ConcurrentModificationException, потому что часть вашего код в while l oop делает именно это - он изменяет базовую коллекцию.

Стандартный подход состоит в том, чтобы (а) создать новую копию коллекции и выполнить итерацию по этой копии только для чтения или (б) поместить изменения в отдельную коллекцию.

0 голосов
/ 23 апреля 2020

Что делает функция refresh? Насколько я понимаю, вы получаете их только потому, что вы модифицировали HashMap во время итерации, я получал эти ошибки, когда использовал что-то на карте, значит размер увеличивался.

Также вам нужно поставить все под вопрос, как CaseSetting класс

...