« Subversion を使っています | メイン | CentOS に redmine 1.0.0 RC をインストールする (1) »

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

トラックバック

このエントリーのトラックバックURL:
http://blog.crm.co.jp/mt-cgi/mt-tb.cgi/204

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

開発製品

jirologos.gif

About

2010年01月27日 21:24に投稿されたエントリのページです。

ひとつ前の投稿は「Subversion を使っています」です。

次の投稿は「CentOS に redmine 1.0.0 RC をインストールする (1)」です。

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

Powered by
Movable Type