回答編集履歴
1
修正と補足
answer
CHANGED
@@ -5,9 +5,10 @@
|
|
5
5
|
//処理
|
6
6
|
}
|
7
7
|
```
|
8
|
+
(ただし、拡張for文の場合はこのiteratorにアクセスする術は存在しない)
|
8
|
-
この場合、for文の
|
9
|
+
この場合、for文の中で同じコレクションを参照するオブジェクトがListとIteratorの2つ存在する状態になります。
|
9
10
|
このように、Iteratorで反復処理をしている間は、Iterator自身の変更メソッド以外でリストに変更が加えられた場合(Listの方から変更を加えるような場合)にIteratorはできるだけ早く例外を発生させる仕組みになっています。
|
10
|
-
ArrayListがiterator()メソッドで生成するIteratorを調べてみると、hasNext()メソッドは「現在のカーソル位置の数値とリスト総数が同じでない場合trueを返す」という実装になっています。next()やremove()の操作の時に、もとのリストでIteratorが想定していない変更が加えられていた場合に、例外を発生させる仕組みになっています。
|
11
|
+
ArrayListがiterator()メソッドで生成するIterator(例外ログ中のArrayList$Itrがこれ)を調べてみると、hasNext()メソッドは「現在のカーソル位置の数値とリスト総数が同じでない場合trueを返す」という実装になっています。next()やremove()の操作の時に、もとのリストでIteratorが想定していない変更が加えられていた場合に、例外を発生させる仕組みになっています(例外ログのcheckForComodification)。
|
11
12
|
1と3のコードはリスト操作の結果、カーソル位置とリスト総数が一致しないためループが続行し、next()を呼んだ時に例外が発生しますが、2の場合はリスト操作の結果、**たまたま**カーソル位置とリスト総数が一致したため、次のループに入らずに、next()も呼ばれないために、例外が発生していないのです。
|
12
13
|
|
13
14
|
過去に同じような質問をしている方がいますのでこちらもご参照ください。
|