Как в Java перехватить несколько исключений в одном блоке catch?

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

Ответ

Да, начиная с Java 7 можно перехватывать несколько исключений в одном блоке catch. Для этого типы исключений перечисляются через вертикальную черту |.

Пример синтаксиса:

try {
    // Код, который может выбросить IOException или SQLException
} catch (IOException | SQLException e) {
    // Обработка обоих типов исключений
    System.out.println("Произошла ошибка ввода-вывода или базы данных: " + e.getMessage());
}

Ключевые правила и особенности:

  1. Непересекающиеся типы: Исключения в списке не должны находиться в отношении наследования. Например, catch (Exception | IOException e) вызовет ошибку компиляции, так как IOException уже является подтипом Exception.
  2. Тип переменной-исключения: Переменная e будет иметь тип ближайшего общего суперкласса для всех перечисленных исключений. В примере выше это Exception.
  3. Повышение читаемости: Такой подход устраняет дублирование кода обработки, когда для нескольких типов исключений логика идентична.
  4. Модификатор final: На переменную e неявно накладывается модификатор final, поэтому переназначить её внутри блока catch нельзя.