ConcurrentModificationException,帮助我理解一些东西

时间:2013-01-14 22:57:29

标签: java exception

我不太清楚为什么我会在这个方法中获得一个例外以及为什么在这个位置? (那里没有修改)

   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,但我使用迭代器来遍历它。

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

1 个答案:

答案 0 :(得分:5)

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

eventIterator.remove();

javadoc of ArrayList

中解释了此行为
  

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

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