2017-06-28 3 views
0

リストを繰り返し処理してオブジェクトを削除するメソッドがあります。for-eachループがスローしていないConcurrentModificationException

public void iterateAndRemove(List<String> l) { 
    for (String s : l) { 
     l.remove(s); //should throw exception 
    } 
} 

Iteratorを使用していないので理想的には例外が発生します。

ただし、正常に動作します。私の理解は間違っていますか?

答えて

0

Iteratorを介して削除することは、フェールセーフな手段であることが広く知られています。

しかしをするために、各ループのjavacは、内部で繰り返しhasNextnextメソッドを呼び出し、イテレータを使用するコードを生成するため、リストから項目を削除するために使用することができます。

さらに、for-eachが同時変更例外をスローする場合でも、プログラムが常に例外をスローする必要はないので、いくつかのテストを実行する必要はありません。

ただし、これはシングルスレッド環境でも当てはまることに注意してください。マルチスレッド環境では、プログラムが例外をスローしないようにオブジェクトをロックする必要があります。

関連する問題