ConcurrentModificationException,帮助我理解一些东西

Jam*_*sev 0 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);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

似乎这里唯一被修改的是eventGroup,但我使用迭代器来遍历它.

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

ass*_*ias 5

eventIterator是一个迭代器eventGroup,你eventGroup.remove(event);在迭代时调用.您应该使用迭代器来删除项目:

eventIterator.remove();
Run Code Online (Sandbox Code Playgroud)

ArrayListjavadoc中解释了此行为:

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

注意:您遇到同样的问题,eventsGroup应该替换eventGroups.remove(eventGroup);groupIterator.remove();.