-1

欢迎,我正在用 java 小程序编写一个简单的 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

正如我们看到的错误出现在程序结束时的绘制方法中,但我不知道这可能是由于程序开始时错误启动引起的?

public void initLocatables()
public void initLocatables2()

我不得不承认它们是在运行方法中的 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();
}*/

感谢您的任何回复。

4

3 回答 3

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();
于 2013-08-23T21:02:18.837 回答
1

java.util.ConcurrentModificationException 另一种方法是使用 for 循环遍历 locatablesArray 从末尾开始与开头。这样,任何被删除的元素都不会改变数组中尚未被扫描的元素的位置。

于 2013-08-23T21:06:33.757 回答
1

也许当你打电话repaint()run()paint()排队到 EDT 并尽快打电话;而对in的迭代locatablesArray调用是另一次完成的,并且在同一时间重新初始化 of的代码将产生错误。 我的建议是在特定的 init 部分中分离 init 操作并调用它一次,运行你的主循环。initLocatables2()run()locatablesArraypaint()

还有一件事:你为什么要在里面初始化一个Iterator(类字段itrLocatablesinitLocatables2()?如果可能,在需要时使用迭代器。

希望清楚,英语不是我的母语。

于 2013-08-23T21:29:54.363 回答