Sobes.tech
Назад к вопросам
Junior — Middle
104

Что означает возникновение исключения ConcurrentModificationException в Java, и в каких ситуациях оно может быть выброшено?

Компании, где спрашивали
Т-БанкТ-Банк
СБЕР дейвайсыСБЕР дейвайсы

Ответ от нейросети

sobes.tech AI

Исключение ConcurrentModificationException в Java возникает, когда во время итерации по коллекции происходит её структурное изменение (например, добавление или удаление элементов) не через итератор, а напрямую через методы коллекции. Это механизм fail-fast, который предупреждает о потенциально опасных изменениях, которые могут привести к некорректной работе итератора.

Типичные ситуации, когда выбрасывается это исключение:

  • Итерация по ArrayList с помощью Iterator, при этом в цикле вызывается list.remove() напрямую, а не через iterator.remove().
  • Модификация коллекции из другого потока во время итерации без синхронизации.

Пример:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
    if (s.equals("b")) {
        list.remove(s); // выбросит ConcurrentModificationException
    }
}

Правильный способ удаления во время итерации:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s.equals("b")) {
        iterator.remove(); // безопасно
    }
}