我不太确定为什么在此方法中会遇到异常,为什么在此位置? (那里没有修改发生)
Iterator<EventGroup> groupIterator = eventGroups.iterator();
while (groupIterator.hasNext()) {
EventGroup eventGroup = groupIterator.next();
Iterator<ScheduledEvent> eventIterator = eventGroup.getEvents().iterator();
while (eventIterator.hasNext()) {
ScheduledEvent event = eventIterator.next(); // <------------- ConcurrentModificationException
boolean found = ((SomeObject) event).getSomeId() == someId;
if (found) {
unschedule++;
unscheduleEvent(event);
eventGroup.remove(event);
if (eventGroup.isEmpty()) {
eventGroups.remove(eventGroup);
}
}
}
}
似乎唯一要修改的地方是
eventGroup
,但我使用的是迭代器。请帮助我了解这里发生了什么?
最佳答案
eventIterator
是eventGroup
上的迭代器,您在迭代时调用eventGroup.remove(event);
。您应该使用迭代器删除该项目:
eventIterator.remove();
javadoc of ArrayList中对此行为进行了解释:
此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,则除了通过迭代器自己的remove或add方法之外,迭代器都会抛出ConcurrentModificationException。
注意:
eventsGroup
存在相同的问题,应将eventGroups.remove(eventGroup);
替换为groupIterator.remove();
。