OSCA

ConcurrentModificationExceptionがコレクションの処理で発生する (Java)

投稿日:2009年11月17日

このエントリーをはてなブックマークに追加

Javaでコレクション処理中に ConcurrentModificationException が発生したので、原因と解決法をメモする。

要件

要件は以下のようだった。

悪いソース (Bad code)

for( Iterator iterator = map.keySet.iterator(); iterator.hasNext(); ) {
    Object key = iterator.next();
    if( this.isHoge(key) ) map.remove(key);
}

※this.isHoge() は、削除する対象か否かを判定するためのメソッドとする。

上記のようなコードで、iteratorのnextメソッドで、ConcurrentModificationExceptionが発生した。
理由は、mapの持つ要素のコレクションをiteratorで回しているにも関わらず、ループの中でmap自体の要素を削除していっているため、ループのためのコレクションが保てなくなったため。

修正後のソース (Good code)

Object[] keys = super.keySet().toArray();

for( Object key : keys ) {
    if( this.isHoge(key) ) {
        map.remove(key);
    }
}

あー、考えれば当たり前のことなのに、考えが一転倒になってしまって、ハマってしまった・・・(涙)

著者 : OSCA

OSCA

個人として何か一つでも世の中の多くの人に使ってもらえるサービスを作ろうと日々奮闘中のエンジニア。 夜景好きのアマチュア写真家でもあります。
Twitter : @oscaphoto
Facebook : OSCA