ConcurrentModificationException (Java) - PullRequest
       13

ConcurrentModificationException (Java)

4 голосов
/ 26 апреля 2011
Exception in thread "main" java.util.ConcurrentModificationException
Squash the PC dirties the room Violet. The room's state is now dirty
Lily the animal growls
The Animal Lily left the room and goes to Green through the west door.
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
        at java.util.HashMap$KeyIterator.next(HashMap.java:828)
        at homework5.Room.critReactRoomStateChange(Room.java:76)
        at homework5.PC.play(PC.java:121)
        at homework5.Main.main(Main.java:41)
Java Result: 1

Это ошибка, которую я получаю.

Мой метод выглядит как

public void critReactRoomStateChange(String command, PC pc) {
    Creature temp = null;
    Iterator iterator = getCreatures().keySet().iterator();
    while (iterator.hasNext()) {
        String names = iterator.next().toString();
        if (!(getCreatures().get(names) instanceof PC)) {
            temp = getCreatures().get(names);
            if (temp != null) {
                temp.reactStateChange(command, pc);
                temp.checkNewRoom();
            }
        }
    }
} 

Итак, я понимаю, что это означает, что я изменяю размер итератора до его завершения, и это ошибка, которую вы получаете. Это верно, так как один из responseStateChange предназначен для удаления объекта из hashMap. Как сделать это безопасно, чтобы, когда я что-то удалял, он заранее сообщал об этом итератору, чтобы я мог избежать этой ошибки. Заранее спасибо. Если понадобится больше деталей, я буду рад удовлетворить ваши запросы.

Ответы [ 3 ]

8 голосов
/ 26 апреля 2011

Единственный безопасный способ удалить элемент из базовой коллекции и продолжить итерацию - это использовать remove() метод Iterator.При этом удаляется последний элемент, возвращенный методом next() Iterator.

. В вашем случае кажется, что для этого потребуется передать Iterator методу, который выполняет изменение (или сделать его).поле экземпляра, как у объекта Map).

1 голос
/ 26 апреля 2011

Другой вариант - использовать ConcurrentHashMap, у которого нет этой проблемы.Вы можете использовать это как замену, и вам не нужно менять остальную часть кода.

1 голос
/ 26 апреля 2011

Вы удаляете его, используя iterator.remove ().

...