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);
    }
}
あー、考えれば当たり前のことなのに、考えが一転倒になってしまって、ハマってしまった・・・(涙)





 CentOS 7にRubyをインストールし、Ruby on Railsアプリケーションを作成・起動するまでの手順
CentOS 7にRubyをインストールし、Ruby on Railsアプリケーションを作成・起動するまでの手順 Apache MavenをmacOSにHomebrewでインストールする手順
Apache MavenをmacOSにHomebrewでインストールする手順 MySQL Server 5.7 を Windows にインストールする手順
MySQL Server 5.7 を Windows にインストールする手順 WindowsにOpenJDK 12(Oracle版)をインストールする手順
WindowsにOpenJDK 12(Oracle版)をインストールする手順 Homebrewのエラー「Git must be installed and in your PATH!」の解決方法
Homebrewのエラー「Git must be installed and in your PATH!」の解決方法 Docker CEを Ubuntu 16.04 TLS (Xenial Xerus) にaptインストールする手順
Docker CEを Ubuntu 16.04 TLS (Xenial Xerus) にaptインストールする手順 WEBエンジニア勉強会 #11 を開催しました
WEBエンジニア勉強会 #11 を開催しました