7

これが私のコードです:

// eventList is a LinkedList

public void run() {

    Iterator<Event> it = eventList.iterator();
    int size = eventList.size();

    while(size > 0) {
        while(it.hasNext()) {
            Event e = it.next(); //flaged line

            if(e.ready()) {
                System.out.println(e);
                e.action();
                eventList.remove(e);
                --size;
            }
        }
    }
}

エラーjava.util.ConcurrentModificationExceptionは、フラグが並んでいる場所 ( ) でスローされEvent e = it.next();ます。その例外がスローされる理由を明らかにする私のコードに誤りがありますか?

4

2 に答える 2

17

それを繰り返しeventListながら使用しながら変更しています。eventList.remove()使用できなくなりますIterator

に置き換えるだけeventList.remove(e)it.remove()問題ありません。

また、イベントの 1 つが最初の実行で準備ができていない場合、一度返さit.hasNext()れると決して返されず、変更もされないため、簡単に無限ループに陥る可能性があります。1 つの解決策は、行全体を最初のループ内に移動することです。truefalsesizeIterator it = ...while

また、手動でサイズを追跡する代わりに、外側のwhileループを使用するように変更します。while (!e.isEmpty())eventList

于 2011-04-13T07:32:56.377 に答える
1

イテレータを介して要素を削除する必要があります。そうしないと、基になるコレクションが変更されたためにイテレータがリセットされます。

于 2011-04-13T07:33:52.323 に答える