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!
}
}しかし、結果の代わりに、例外をキャッチします。
🤛なぜこのようなことが起こるのでしょうか?
for-each が使用しているため イテレーター その間、リスト自体を変更します。これは、あなたが橋を渡っている間に誰かがあなたの後ろの板を取り外しているようなものです。JVMは次のようになります:「ストップ!これは安全ではありません!」🚨
🔍 何がエラーを引き起こしているのかを理解する方法
list.remove()内部for-eachmap.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 ++の詳細なレッスン、ステップバイステップのエクササイズ、エラー解析、そしてあなたの携帯電話またはブラウザで簡単に練習することができます。
ニュース、新機能、役立つ資料を知りたい場合は、当社のニュースレターをご購読ください。 テレグラムチャンネル. そこは快適で、ビジネスに向いており、コードへの愛情が ❤️
