Java小程序在从迭代器数组中删除对象时抛出错误

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

欢迎,我正在用JavaApplet编写一个简单的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)
这就是错误日志的样子。程序代码:

正如我们所看到的,在程序结束时,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();