1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Java]ConcurrentModificationExceptionが出る時の対処方法

Posted at

個人的なメモとして残しておきます。
まずエラーが出るコードがこちら

List<String> sList = new ArrayList<>();
        sList.add("A");
        sList.add("B");
        sList.add("C");
        sList.add("D");

for(String s : sList) {
    if(s.equals("B")) {
        sList.remove(s);
    } else {
        System.out.println(s);
    }
}

上記のプログラムを実行するとConcurrentModificationExceptionという実行時エラーが発生します。
これはforEachの中で要素を削除していることが原因で起こっています。
例外として最後の要素と最後から2つ目の要素は削除してもエラーは起きません。

代替方法

ここでは特定の要素を削除してそれ以外の要素を出力したいと仮定します。
まずはremoveIfで特定の要素を削除してからforEachで出力する方法

sList.removeIf(s -> s.equals("B"));
for(String s : sList) {
    System.out.println(s);
}

次にforEachではなくて普通のforを使う方法です。

for(int i = 0; i < sList.size(); i++ ) {
    if(sList.get(i).equals("B")) {
        sList.remove(sList.get(i));
        i--;
    } else {
        System.out.println(sList.get(i));
    }
}

この方法は要素を削除した分インデックスが前にずれるのでそれを解消する為に削除した際にインデックスを1減らしています。
個人的にはこの方法よりもremoveIfで特定の要素を削除してから出力する方法の方がコードも少なくてわかりやすいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?