0

我不太清楚为什么我在这个方法开始时会出现异常以及为什么在这个位置?(那里没有修改)

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

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

4

1 回答 1

5

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

eventIterator.remove();

此行为在ArrayList 的 javadoc 中进行了解释:

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

注意:你有同样的问题,eventsGroup你应该eventGroups.remove(eventGroup);groupIterator.remove();.

于 2013-01-14T22:58:57.060 回答