😵 Почему ConcurrentModificationException так часто ловят джуны

Разбираем с примерами, почему список нельзя менять в цикле и как не наступить на этот баг

Разработка

6 мин

Когда ты только начинаешь писать на Java, одна из первых ошибок, с которой сталкиваются новички — это страшный зверь с длинным именем: ConcurrentModificationException. Эта ошибка выглядит пугающе, но причина её — банальна. Давайте разберёмся, почему она возникает и как её избежать.

Что вообще происходит?

List<String> names = new ArrayList<>();
names.add("Аня");
names.add("Борис");
names.add("Вика");

for (String name : names) {
    if (name.equals("Вика")) {
        names.remove(name); // 💥 ConcurrentModificationException!
    }
}

Но вместо результата ты ловишь исключение.

🤛 Почему это происходит?

Потому что 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("Вика")) {
        names.remove(i);
        i--;
    }
}

🛠 Способ 2: Используй Iterator

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

🛠 Способ 3: Используй removeIf

names.removeIf(name -> name.equals("Вика"));

🤯 Почему джуны часто ошибаются

  • ❌ Не знают, что for-each внутри использует Iterator

  • ❌ Путают remove() у коллекции и у итератора

  • ❌ Боятся использовать Iterator, потому что он кажется «старым»

  • ❌ Не читают стек трейс внимательно

💬 Как это звучит на собесе

— Почему у тебя в коде ConcurrentModificationException?
— Я просто удалял элемент внутри for-each...

ConcurrentModificationException — это не баг, это защита от потенциально опасного поведения. И если ты её поймал — радуйся! Ты теперь на шаг ближе к тому, чтобы понять Java на глубоком уровне 🧩

📚 Хочешь углубиться в тему?

В приложении Кодик ты найдёшь подробные уроки по CMake и C++, пошаговые упражнения, разбор ошибок и удобную практику прямо в телефоне или браузере.

А если хочешь быть в курсе новостей, новых фич и полезных материалов — подписывайся на наш Telegram-канал. Там уютно, по делу и с любовью к коду ❤️

Комментарии