この記事ではJavaの ・ConcurrentModificationExceptionの原因 ・ConcurrentModificationExceptionの解決法 について解説しています。
目次
JavaのConcurrentModificationExceptionとは?
ConcurrentModificationException
は、Javaコレクションを反復処理中に変更した場合に発生する例外です。例えば、ArrayList
やHashMap
の要素をループで反復処理している最中に、そのコレクションの内容を変更しようとするとこの例外がスローされます。本記事では、ConcurrentModificationException
の原因、解決方法、具体例について説明します。
ConcurrentModificationExceptionの原因
ConcurrentModificationException
が発生する主な原因は以下の通りです。
- コレクションの変更: 反復処理中にコレクションの要素を追加、削除、または更新した場合。
- マルチスレッド環境: 複数のスレッドが同じコレクションを同時に操作した場合。
- 不適切な反復処理: 反復処理中にコレクションの直接操作を行った場合。
ConcurrentModificationExceptionの解決方法
ConcurrentModificationException
を解決するためには、以下のような方法があります。
- 反復処理中の変更を避ける: コレクションを反復処理中に変更しないようにする。
- Iteratorを使用する:
Iterator
を使用してコレクションを反復処理し、Iterator
のremove
メソッドを使用して要素を削除する。 - Concurrentコレクションを使用する: マルチスレッド環境では、
ConcurrentHashMap
やCopyOnWriteArrayList
などのスレッドセーフなコレクションを使用する。
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
を使用する、スレッドセーフなコレクションを使用することで、この例外を回避し、コレクション操作を正しく行うことができます。