{}const=>[]async()letfn</>var
開発

😵 なぜConcurrentModificationExceptionは頻繁にジュンに捕まるのですか

ループ内でリストを変更できない理由と、このバグを回避する方法を例を挙げて説明します。

К

Kodik

著者

1分で読める

Javaで書き始めたばかりのとき、初心者が遭遇する最初のエラーの1つは、長い名前を持つ恐ろしい獣です。 ConcurrentModificationException。このエラーは恐ろしいように見えますが、その理由は平凡です。なぜ発生するのか、そしてそれを回避する方法を見てみましょう。

何が起こっているのでしょうか?

List<String> names = new ArrayList<>();
names.add("Anya");
names.add("Boris");
names.add("Vika");

for (String name : names) {
    if (name.equals("Vika")) {
        names.remove(name); // 💥 ConcurrentModificationException!
    }
}

しかし、結果の代わりに、例外をキャッチします。

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

🤛なぜこのようなことが起こるのでしょうか?

for-each が使用しているため イテレーター その間、リスト自体を変更します。これは、あなたが橋を渡っている間に誰かがあなたの後ろの板を取り外しているようなものです。JVMは次のようになります:「ストップ!これは安全ではありません!」🚨

🔍 何がエラーを引き起こしているのかを理解する方法

  • list.remove() 内部 for-each

  • map.put() 内部 for によって map.entrySet()

  • Stream内のコレクションを介した変更

✅ 正しい方法

🛠 方法1:通常のforを使用する

for (int i = 0; i < names.size(); i++) {
    if (names.get(i).equals("Vika")) {
        names.remove(i);
        i--;
    }
}

🛠 方法2:Iteratorを使用する

Iterator<String> it = names.iterator();
while (it.hasNext()) {
    if (it.next().equals("Vika")) {
        it.remove();
    }
}

🛠 方法3:removeIfを使用する

names.removeIf(name -> name.equals("Vika"));

🤯 なぜジュンはしばしば間違えるのか

  • for-each が内部で Iterator を使用していることを知らない

  • ❌ コレクションとイテレーターのremove()を混同する

  • ❌「古い」ように見えるので、Iteratorを使用することを恐れている

  • ❌トレーススタックを注意深く読まない

💬 面接ではどのように聞こえるか

— なぜコードに ConcurrentModificationExceptionがあるのですか?
— 私は単にfor-each内の要素を削除しました...

ConcurrentModificationExceptionはバグではなく、潜在的に危険な動作からの保護です。そして、もしあなたがそれを見つけたなら、喜んでください!これで、Java を深く理解するための一歩を踏み出しました 🧩

📚 このテーマについてもっと詳しく知りたいですか?

アプリで コディック CMakeとC ++の詳細なレッスン、ステップバイステップのエクササイズ、エラー解析、そしてあなたの携帯電話またはブラウザで簡単に練習することができます。

ニュース、新機能、役立つ資料を知りたい場合は、当社のニュースレターをご購読ください。 テレグラムチャンネル. そこは快適で、ビジネスに向いており、コードへの愛情が ❤️

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要