同じリストで2つの異なるイテレータを使用していて、リストの1つを変更しているため、ConcurrentModificationExceptionをスローする次のコードがあります。したがって、他のイテレータがリストを変更したため、リストを読み込むときに2番目のイテレータが例外をスローします。Javaの反復子がConcurrentModification例外をスローするタイミングを知る方法
List<Integer> list = new ArrayList<>();
populate(list);//A method that adds integers to list
ListIterator<Integer> iterator1 = list.listIterator();
ListIterator<Integer> iterator2 = list.listIterator();
while (iterator1.hasNext()) {
if(iterator1.next() < 5)
iterator1.remove();
}
while (iterator2.hasNext()){
if(iterator2.next() < 5) {
//Call handler
}
}
私の質問はどのようiterator2
が、それはまだiterator1
によって除去された要素に到達していない場合list
は、他のいくつかの反復子が変更されているいることを、内部を知っているんでしょうか?他のiterator
がlist
に変異を起こしていることがどのようにわかりますか? 1つの方法ではサイズを把握することができますが、他のイテレータでは要素を置き換えることができるので、それは理由ではありません。
なぜ気になりますか?リストを変更する前にイテレーターを作成しました。おそらく "汚い"フラグがありますが、なぜこのように動作するようにコードしたいのでしょうか? – stdunbar
私はこのようなコードを動作させたくありません。しかし、私はこのシナリオがどのように検出されたかを知っています。 –
ソースを自由に利用できます! –