Java小程序在从迭代器数组中删除对象时抛出错误
欢迎,我正在用JavaApplet编写一个简单的RPG游戏。它变得越来越复杂,许多错误摆在我面前。今天我遇到了Java小程序在从迭代器数组中删除对象时抛出错误,java,applet,next,concurrentmodification,remove-method,Java,Applet,Next,Concurrentmodification,Remove Method,欢迎,我正在用JavaApplet编写一个简单的RPG游戏。它变得越来越复杂,许多错误摆在我面前。今天我遇到了.remove()的问题方法 Exception in thread "AWT-EventQueue-1" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$It
.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)
这就是错误日志的样子。程序代码:
正如我们所看到的,在程序结束时,paint methid中出现了错误,但我不知道这可能是由于程序开始时的错误启动引起的
public void initLocatables()
public void initLocatables2()
我必须承认,它们是在运行方法中的main while循环中调用的。
这是出现错误的地方,在下面的注释中,我已经包括了前面的方法,它也抛出了错误,这两个方法都在remove()中代码>
感谢您的回复。在迭代对象时,无法从列表/映射中删除对象。这就是导致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();
java.util.ConcurrentModificationException
另一种方法是使用for循环,通过locatablesArray从末尾开始,而不是从开头开始。这样,删除的任何元素都不会更改阵列中尚未扫描的元素的位置
也许当您在run()
中调用repaint()
时,paint()
会排队等待EDT并尽快调用;在迭代locatablesArray
时,在run()
中调用initLocatables2()
将在另一时间完成,同时locatablesArray
的重新初始化paint()
的代码将产生错误。
我的建议是在特定的init部分中分离init操作并调用它一次,然后运行主循环
还有一件事:为什么要在initLocatables2()
中初始化一个Iterator
(类字段itrLocatables
)?如果可能,在需要时使用迭代器。
希望澄清,英语不是我的母语。Iterator.remove()
用于从您使用Iterator进行迭代的集合中删除项目。对于您的评论,正确的例外是UnsupportedOperationException
您都是对的,但您必须记住ConcurrentModificationException
是未选中的,如果您检查LinkedList
源代码,您将发现remove()上的抛出
methodfrom LinkedList javadoc:该类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时候,以迭代器自己的remove或add方法以外的任何方式对列表进行结构修改,迭代器将抛出ConcurrentModificationException。您可以从备份到-LinkedList
迭代器中执行Iterator.remove()
,但如果有人从外部修改LinkedList
,您将有一个ConcurrentModificationException
。好的,伙计们,如果你们想知道我发现了我的错误。这是在wile循环中,我在那里调用locatables的initiation,这就是为什么数组修改得太快,现在我将方法调用放在interactios的for循环之前。:)非常感谢。
for (Iterator i = locatablesArray.listIterator(); i.hasNext();) {
Locatable l = (Locatable) i.next();
l.draw(g);
}
// Clear everything from the list
locatablesArray.clear();