Исключение при одновременной модификации, не удаляя ничего

Я пишу простую игру Tower Defense на Java. Вот метод, который находит путь от порождения (установленного в конструкторе) до ближайшей базы.

public int[] findPath(Field startField) {
    ArrayList monsrs = new ArrayList();
    TestMonster first = new TestMonster(startField.getCenter(), getStartingDirection(startField), new int[0]);
    monsters.add(first);
    while (true) {
        for (TestMonster monsr : monsrs) {
            monster.move();
            if (getFieldFromCenter(monsr.getPoint()).getState() == 101)
                return monsr.getPath();
            Field field = getFieldFromCenter(monsr.getPoint());
            if (field.isUp())
                monsters.add(new TestMonster(monsr.getPoint(), 0, monster.getPath()));
            if (field.isRight())
                monsters.add(new TestMonster(monsr.getPoint(), 90, monster.getPath()));
            if (field.isDown())
                monsters.add(new TestMonster(monsr.getPoint(), 180, monster.getPath()));
            if (field.isLeft())
                monsters.add(new TestMonster(monsr.getPoint(), 270, monster.getPath()));
            if (monsrs.isEmpty())
                return null;
        }
    }
}

Он может возвращать массив следующих направлений, в которые монстр перемещался, чтобы добраться до базы или null, если нет пути. Он проходит через поля, которые являются объектами класса Field. На каждом поле монстр ищет возможные движения, и для каждого создается новый монстр с заданным направлением. Новый монстр наследует также перемещает массив, чтобы добавить к нему свое собственное направление, а затем дать его новому монстру и так далее. И мой вопрос в том, где в моем коде есть возможность одновременного mod ex? И как я могу это предотвратить?

STACK TRACE:

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at towerdefence.MainPanel.findPath(MainPanel.java:160)
at towerdefence.MainPanel$1.actionPerformed(MainPanel.java:62)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1664)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:306)
at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:250)
at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2971)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2963)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
at java.awt.Component.processEvent(Component.java:6282)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
0
nl ja de
поставьте стопку
добавлено автор Renjith, источник
Модификация == Добавить || Удалить.
добавлено автор Rohit Jain, источник
поместите также стек. Я не вижу никаких объектов, добавляемых в monsrs
добавлено автор basiljames, источник

3 ответы

Итераторы не работают быстро, поэтому не могут одновременно изменять коллекцию, если вы используете итератор поверх нее, чтобы итерировать коллекцию. означает использование итератора, вы не можете одновременно перебирать и изменять коллекцию. например, добавлять или удалять что-то в коллекции, над которыми вы ищите.

Что такое быстрый итератор с ошибкой

Also see this question fail-fast iterator

1
добавлено
За исключением использования самого итератора.
добавлено автор Fildor, источник

Попробуйте это, может решить вашу проблему

List monsrs = Collections.synchronizedList(new ArrayList());

ArrayList implementation is not synchronized, You'll need to synchronize the access to your list. You can accomplish this either by synchronizing the encpasulating object or by using Collections.synchronizedList method.

Подробнее см.

0
добавлено

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

Вы не можете изменить список, который вы выполняете. Пример:

List list = new ArrayList(); list.add("object 1"); list.add("object 2"); for (Object object : list) { list.add("another one"); } 

Он также выкинет java.util.ConcurrentModificationException.

For a more detailed information, please read the documentation: http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async