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

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

Ответ

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

Синтаксис и пример:

try {
    // Код, который может выбросить разные исключения
    Files.copy(source, target); // Может выбросить IOException
    executeDatabaseQuery();     // Может выбросить SQLException
} catch (IOException | SQLException e) {
    // Обработка для обоих типов исключений
    logger.error("Ошибка операции ввода-вывода или базы данных", e);
    throw new ApplicationException("Operation failed", e);
}

Ключевые правила:

  • Исключения в списке должны быть непересекающимися (нельзя catch (Exception | IOException e), так как IOException уже является подклассом Exception).
  • Переменная исключения (e) будет иметь тип ближайшего общего предка для всех перечисленных типов. В примере выше это Exception.
  • Внутри блока catch вы не можете делать предположения о более конкретном типе, чем объявлено. Для разной логики под разные типы используйте отдельные блоки catch.