1

このコードを実行すると、「例外が発生しました: java.util.ConcurrentModificationException」が表示されます。ここにいる誰かが問題が何であるかを理解していますか?

public void mudaDeEstado() {
    Luz luz = new Luz();
    while(this.iterador.hasNext()) {
        luz = (this.iterador.next());
        luz.defineEstado(!luz.acesa());
    }

}

どうもありがとう!!

4

2 に答える 2

7

要素のループ中に反復子が保持する参照を変更しようとしています。彼の例外の詳細については、こちらをご覧ください。

たとえば、あるスレッドが Collection を変更しているときに、別のスレッドが Collection を反復処理することは一般的に許可されていません。一般に、反復の結果は、これらの状況では未定義です。一部の Iterator 実装 (JRE によって提供されるすべての汎用コレクション実装の実装を含む) は、この動作が検出された場合に、この例外をスローすることを選択する場合があります。これを行う反復子は、将来の不確定な時点で恣意的で非決定論的な動作を危険にさらすのではなく、迅速かつ明確に失敗するため、フェイルファスト反復子として知られています。

おそらくここでの犯人はこれです:

luz.defineEstado(!luz.acesa());
于 2011-02-21T20:32:02.713 に答える
2

この例外は、反復処理中にデータ構造を変更するとスローされます。データ構造の要素を変更すると、要素を反復処理する方法が変わる可能性があるため、多くのデータ構造では同時変更が許可されていません。

更新が必要な要素のリストを保持し、データ構造全体を繰り返し処理したら、それらの要素に戻って更新してみてください。

申し訳ありませんが、私の言い回しは一般的で曖昧ですが、提供されたコードで詳細を説明するのは困難です。

于 2011-02-21T20:35:22.767 に答える