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で説明されています。

このクラスのイテレータメソッドとlistIteratorメソッドによって返されるイテレータはフェイルファストです。イテレータの作成後にリストが構造的に変更された場合、イテレータ自体のremoveまたはaddメソッド以外の方法で、イテレータはConcurrentModificationExceptionをスローします。

注:と同じ問題がeventsGroupあり、に置き換える必要がありeventGroups.remove(eventGroup);ますgroupIterator.remove();

于 2013-01-14T22:58:57.060 に答える