【Java】ConcurrentModificationExceptionとは?原因と解決方法

この記事ではJavaの ・ConcurrentModificationExceptionの原因 ・ConcurrentModificationExceptionの解決法 について解説しています。

目次

JavaのConcurrentModificationExceptionとは?

ConcurrentModificationExceptionは、Javaコレクションを反復処理中に変更した場合に発生する例外です。例えば、ArrayListHashMapの要素をループで反復処理している最中に、そのコレクションの内容を変更しようとするとこの例外がスローされます。本記事では、ConcurrentModificationExceptionの原因、解決方法、具体例について説明します。

ConcurrentModificationExceptionの原因

ConcurrentModificationExceptionが発生する主な原因は以下の通りです。

  • コレクションの変更: 反復処理中にコレクションの要素を追加、削除、または更新した場合。
  • マルチスレッド環境: 複数のスレッドが同じコレクションを同時に操作した場合。
  • 不適切な反復処理: 反復処理中にコレクションの直接操作を行った場合。

ConcurrentModificationExceptionの解決方法

ConcurrentModificationExceptionを解決するためには、以下のような方法があります。

  • 反復処理中の変更を避ける: コレクションを反復処理中に変更しないようにする。
  • Iteratorを使用する: Iteratorを使用してコレクションを反復処理し、Iteratorremoveメソッドを使用して要素を削除する。
  • Concurrentコレクションを使用する: マルチスレッド環境では、ConcurrentHashMapCopyOnWriteArrayListなどのスレッドセーフなコレクションを使用する。

ConcurrentModificationExceptionの具体例

以下は、ConcurrentModificationExceptionが発生する可能性がある具体的な例です。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcurrentModificationExceptionExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");

        // 直接変更によるConcurrentModificationExceptionの発生例
        try {
            for (String item : list) {
                if (item.equals("two")) {
                    list.remove(item);  // 反復処理中にリストを変更
                }
            }
        } catch (ConcurrentModificationException e) {
            System.err.println("反復処理中に変更が検出されました: " + e.getMessage());
            e.printStackTrace();
        }

        // Iteratorを使用した安全な変更例
        try {
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                String item = iterator.next();
                if (item.equals("two")) {
                    iterator.remove();  // Iteratorを使用してリストを変更
                }
            }
        } catch (ConcurrentModificationException e) {
            System.err.println("反復処理中に変更が検出されました: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

まとめ

ConcurrentModificationExceptionはJavaプログラムでコレクションを反復処理中に変更した場合に発生する例外で、反復処理中のコレクションの変更やマルチスレッド環境での操作が原因です。この記事では、ConcurrentModificationExceptionの主な原因と解決方法について説明しました。反復処理中の変更を避ける、Iteratorを使用する、スレッドセーフなコレクションを使用することで、この例外を回避し、コレクション操作を正しく行うことができます。

目次