Java applet在Iterator数组中删除对象时抛出错误

时间:2013-08-23 20:47:32

标签: java applet next concurrentmodification remove-method

欢迎,我正在使用java applet编写一个简单的RPG游戏。它变得越来越复杂,许多错误都被抛到了我的脸上。今天我对.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

我们可以看到错误出现在程序结尾的paint methid中,但我不知道是否可能是程序开始时错误启动引起的?

public void initLocatables()
public void initLocatables2()

我必须承认它们在run方法中的main while循环中被调用。 这些是出现错误的地方,而在评论中我已经在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 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

  

java.util.ConcurrentModificationException   另一种方法是使用for循环通过locatablesArray从结束开始到开始。这样,任何被删除的元素都不会改变尚未扫描的数组元素的位置。

答案 2 :(得分:1)

也许当您在repaint()中致电run()时,paint()会排队等待EDT并尽快致电;在迭代locatablesArray时,initLocatables2()run()的调用再次完成,locatablesArray的重新生成同时paint()的代码将生成Iterator错误。
我的建议是在特定的init部分中分离init操作并调用它一次,运行你的主循环。

另一件事:为什么要在itrLocatables中初始化initLocatables2()(类字段{{1}})?如果可能,请在需要时使用迭代器。

希望明确,英语不是我的母语。