Какие исключения может вызвать метод `next()` итератора в Java?

«Какие исключения может вызвать метод `next()` итератора в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Вызов Iterator.next() без предварительной проверки hasNext() или при изменении коллекции может привести к исключениям:

  1. NoSuchElementException — если элементов больше нет.

    List<String> list = List.of("a", "b");
    Iterator<String> it = list.iterator();
    it.next(); // "a"
    it.next(); // "b"
    it.next(); // Выбросит NoSuchElementException
  2. ConcurrentModificationException — если коллекция была структурно изменена (добавление/удаление элементов) не через методы самого итератора после его создания. Характерно для fail-fast итераторов (например, в ArrayList, HashMap).

    List<String> list = new ArrayList<>(List.of("a", "b"));
    Iterator<String> it = list.iterator();
    list.add("c"); // Прямое изменение коллекции
    it.next(); // Выбросит ConcurrentModificationException

Правильный паттерн использования:

while (iterator.hasNext()) { // Всегда проверяйте hasNext()
    String element = iterator.next();
    // Обработка элемента
    // iterator.remove(); // Безопасное удаление элемента
}

Почему это важно: Соблюдение этого паттерна гарантирует корректное и предсказуемое поведение при обходе коллекций.