« 2009年11月 | メイン | 2010年08月 »

2010年01月 アーカイブ

2010年01月27日

Java の for の書き方

List 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 から要素を取り出すのだろう。じゃあ先程のは一体何をやっているのか、というのはちょっと気になる。

開発製品

jirologos.gif

About 2010年01月

2010年01月にブログ「三田ブログ」に投稿されたすべてのエントリです。新しい順に並んでいます。

前のアーカイブは2009年11月です。

次のアーカイブは2010年08月です。

他にも多くのエントリがあります。メインページアーカイブページも見てください。

Powered by
Movable Type