ConcurrentModificationExceptionがコレクションの処理で発生する (Java)
Javaでコレクション処理中に ConcurrentModificationException が発生したので、原因と解決法をメモする。
要件
要件は以下のようだった。
- マップに含まれる要素を全て検査して、条件hogeに一致した要素をマップから削除する
悪いソース (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);
}
}
あー、考えれば当たり前のことなのに、考えが一転倒になってしまって、ハマってしまった・・・(涙)