【发布时间】:2014-01-13 17:33:57
【问题描述】:
错误日志:
[26-12-13 3:16]:java.util.ConcurrentModificationException
[26-12-13 3:16]:在 java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
[26-12-13 3:16]:在 java.util.ArrayList$Itr.next(ArrayList.java:791)
[26-12-13 3:16]: 在 server.event.cycle.CycleEventHandler.stopEvents(CycleEventHandler.java:60) [26-12-13 3:16]:在 server.model.players.Client.logout(Client.java:292)
方法:
public void stopEvents(Object owner) {
for (CycleEventContainer c : events) {
if(c.getOwner() == owner) {
c.stop();
}
}
}
问题: 如何解决此错误?
编辑;停止方法:
public void stop() {
isRunning = false;
event.stop();
}
这行得通吗?
public void stopEvents(Object owner) {
ArrayList<CycleEventContainer> garbageEvents = new ArrayList<>();
for (CycleEventContainer c : events) {
if(c.getOwner() == owner) {
garbageEvents.add(c);
}
}
for (CycleEventContainer c: garbageEvents) {
c.stop();
}
garbageEvents.clear();
}
【问题讨论】:
-
events是否在发生在c.stop()、c.getOwner()或不同线程中的其他任何地方发生更改? -
...或被删除?
-
ConcurrentModificationException当迭代器下的数据结构在迭代器迭代时发生变化时抛出。我的猜测是c.stop()正在做一些改变events的事情(例如,从events中删除c)导致此异常。 -
是的,那我应该使用哪种方法?
-
通常您不使用直接迭代器,或者您将要删除的内容收集到列表中,并在迭代完成后批量删除。至少这是我通常看到的方法。
标签: java concurrentmodification