Привет, я программирую простую игру RPG в Java-апплете. Это становится все сложнее, и на меня бросают много ошибок. Сегодня у меня проблема с методом .remove();
.Java applet бросает ошибку в удалении объекта из массива Iterator
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)
Так выглядит журнал ошибок. Код программы:
Как мы можем видеть, ошибка появляется в лакокрасочной methid в конце программы, но я не знаю, может быть, это вызвано неправильным начала в начале программы?
public void initLocatables()
public void initLocatables2()
И я должен признать, что они вызываются в основном в цикле в методе запуска. Это является местом, где apears ошибки, и ниже в комментариях я включил предыдущий метод, который также брошенную ошибку, как в 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();
}*/
Спасибо за любой ответ.
'Iterator.remove()' используется для удаления элемента из Collection your, итерации с использованием 'Iterator'. для вашего комментария правильное исключение: 'UnsupportedOperationException' –
Вы оба правы, но вы должны помнить, что' ConcurrentModificationException' не отмечен, и если вы проверите исходный код 'LinkedList', вы найдете бросок на' remove() 'method –
от LinkedList javadoc: Итераторы, возвращаемые методами итератора этого класса и listIterator этого класса, работают с ошибкой: если список изменяется в любое время после создания итератора, любым способом, кроме как с помощью собственных методов удаления или добавления Iterator, итератор будет вызывать исключение ConcurrentModificationException. Вы можете сделать 'Iterator.remove()' из итератора с поддержкой -LinkedList', но у вас будет 'ConcurrentModificationException', если кто-то изменит' LinkedList' из extern. –