コレクションを反復処理するときに ConcurrentModificationException を回避するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-23 20:23:12
オリジナル
555 人が閲覧しました

How to Avoid ConcurrentModificationException When Iterating Through Collections?

同時変更例外

コレクションを処理する場合、反復子の実行中にコレクションが変更されたことを示す ConcurrentModificationException が発生することがあります。使用。これは、特にコード内に明らかな同時実行性が見られない場合、デバッグする際に混乱を招くエラーになる可能性があります。

次の例を考えてみましょう。

import java.util.*;

public class SomeClass {
    public static void main(String[] args) {
        List<String> s = new ArrayList<>();
        ListIterator<String> it = s.listIterator();

        for (String a : args)
            s.add(a);

        if (it.hasNext())
            String item = it.next();

        System.out.println(s);
    }
}
ログイン後にコピー

このコードでは、ConcurrentModificationException は次のとおりです。イテレータは作成されているがまだ作成されていない間に、リスト s が要素を追加する (s.add() を使用する) ことによって変更されるためスローされます。

この問題を解決するには、リストが完全に設定された後で反復子を作成する必要があります。コードの修正バージョンは次のとおりです。

import java.util.*;

public class SomeClass {

    public static void main(String[] args) {
        List<String> s = new ArrayList<>();

        for (String a : args)
            s.add(a);

        ListIterator<String> it = s.listIterator();
        if (it.hasNext()) {
            String item = it.next();
        }

        System.out.println(s);
    }
}
ログイン後にコピー

この変更により、コレクションが完全に変更された後に反復子が作成され、使用されるようになり、同時実行の問題が回避されます。

以上がコレクションを反復処理するときに ConcurrentModificationException を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート