我不太确定为什么在此方法中会遇到异常,为什么在此位置? (那里没有修改发生)

   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,但我使用的是迭代器。

请帮助我了解这里发生了什么?

最佳答案

eventIteratoreventGroup上的迭代器,您在迭代时调用eventGroup.remove(event);。您应该使用迭代器删除该项目:

eventIterator.remove();


javadoc of ArrayList中对此行为进行了解释:


  此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,则除了通过迭代器自己的remove或add方法之外,迭代器都会抛出ConcurrentModificationException。


注意:eventsGroup存在相同的问题,应将eventGroups.remove(eventGroup);替换为groupIterator.remove();

10-07 14:59