Java-апплет выдает ошибку при удалении объекта из массива Iterator

Добро пожаловать, я программирую простую RPG-игру в Java-апплете. Это становится все более и более сложным, и многие ошибки бросаются мне в лицо. Сегодня у меня проблема с .remove(); метод.

Exception in thread "AWT-EventQueue-1" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.remove(Unknown Source)
    at rpg.main.paint(main.java:365)
    at rpg.main.update(main.java:331)
    at sun.awt.RepaintArea.updateComponent(Unknown Source)
    at sun.awt.RepaintArea.paint(Unknown Source)
    at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Вот так выглядит журнал ошибок. Код программы:

main.java

Как мы видим, ошибка появляется в метиде краски в конце программы, но я не знаю, может быть, это вызвано неправильной инициацией в начале программы?

public void initLocatables()
public void initLocatables2()

И я должен признать, что они вызываются в основном цикле while в методе run. Это место, где появляется ошибка, и ниже в комментарии я включил предыдущий метод, который также выдал ошибку, как в remove();

for (Iterator i = locatablesArray.listIterator(); i.hasNext();) {
               Locatable l = (Locatable) i.next(); 
               l.draw(g);
               i.remove();
            }
/*while(itrLocatables.hasNext())
{
    Locatable l = itrLocatables.next();
    l.draw(g);
    l.remove();
}*/

Спасибо за любой ответ.

3 ответа

Решение

Может быть, когда вы звоните repaint() в run(), paint() находится в очереди на EDT и вызывается как можно скорее; во время итерации locatablesArray вызов initLocatables2() в run() делается в другой раз, и повторное locatablesArray в то же время код paint() выдаст ошибку.
Мой совет - отделить операцию инициализации в определенном разделе инициализации и вызвать ее один раз, запустить ваш основной цикл.

Просто еще одна вещь: почему вы начинаете Iterator (поле класса itrLocatables) в initLocatables2()? Используйте итератор при необходимости, если это возможно.

Надеюсь, что будет ясно, английский не мой родной язык.

java.util.ConcurrentModificationException Другой подход заключается в использовании цикла for через массив locatablesArray, начинающийся в конце, а не в начале. Таким образом, любые удаляемые элементы не изменят расположение элементов массива, которые еще предстоит проверить.

Вы не можете удалять объекты из списка / карты во время их итерации. Это причина ConcurrentModificationException

       i.remove();

Если вы нарисуете все элементы Locatable, а затем очистите коллекцию, возможно, вам следует сначала нарисовать их все, а затем очистить коллекцию, а не удалять их на лету.

for (Iterator i = locatablesArray.listIterator(); i.hasNext();) {
               Locatable l = (Locatable) i.next(); 
               l.draw(g);
}

// Clear everything from the list
locatablesArray.clear();
Другие вопросы по тегам