2009年11月17日火曜日

Java : ConcurrentModificationException

Javaでコレクション処理中に ConcurrentModificationException が発生したのでMEMO。

<要件>
要件は以下のようだった。
  • マップに含まれる要素を全て検査して、条件hogeに一致した要素をマップから削除する

<失敗なソース>
for( Iterator iterator = map.keySet.iterator(); iterator.hasNext(); ) {
    Object key = iterator.next();
    if( isHoge(key) ) map.remove(key);
}

この際、iteratorのnextメソッドで、ConcurrentModificationExceptionが発生した。

理由は、mapの持つ要素のコレクションをiteratorで回しているにも関わらず、ループの中でmap自体の要素を削除していっているため、ループのためのコレクションが保てなくなったため。


<修正後のソース>
Object[] keys = super.keySet().toArray();

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

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

0 件のコメント: