2013-08-23 3 views
-1

Привет, я программирую простую игру 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) 

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

main.java

Как мы можем видеть, ошибка появляется в лакокрасочной 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(); 
}*/ 

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

ответ

1

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

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

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

1

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

 i.remove(); 

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

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

// Clear everything from the list 
locatablesArray.clear(); 
+0

'Iterator.remove()' используется для удаления элемента из Collection your, итерации с использованием 'Iterator'. для вашего комментария правильное исключение: 'UnsupportedOperationException' –

+0

Вы оба правы, но вы должны помнить, что' ConcurrentModificationException' не отмечен, и если вы проверите исходный код 'LinkedList', вы найдете бросок на' remove() 'method –

+2

от LinkedList javadoc: Итераторы, возвращаемые методами итератора этого класса и listIterator этого класса, работают с ошибкой: если список изменяется в любое время после создания итератора, любым способом, кроме как с помощью собственных методов удаления или добавления Iterator, итератор будет вызывать исключение ConcurrentModificationException. Вы можете сделать 'Iterator.remove()' из итератора с поддержкой -LinkedList', но у вас будет 'ConcurrentModificationException', если кто-то изменит' LinkedList' из extern. –

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^