List
があるときに、次のようなコードを書くのは普通のことだが、
for (Item item: list) {
foo(list, item);
}
ここでちょっとした罠があって、エラーになってしまうことがある。
Caused by: java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) at java.util.AbstractList$Itr.next(AbstractList.java:343) at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555)
何が起こったのか。ループの中で list の要素を入れ替えたのだが、それが気に入らないらしい。これは、次のように old style で書いておけば問題ない。
for (int i = 0; i < list.size(); i++) {
Item item = list.get(i);
foo(list, item);
}
これだとその都度 index を使って list から要素を取り出すのだろう。じゃあ先程のは一体何をやっているのか、というのはちょっと気になる。