<要件>
要件は以下のようだった。
- マップに含まれる要素を全て検査して、条件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 件のコメント:
コメントを投稿