Можно ли использовать несколько блоков catch для одного блока try в Java?

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

Ответ

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

Пример:

try {
    // Код, который может выбросить разные исключения
    FileInputStream file = new FileInputStream("missing.txt"); // Может выбросить FileNotFoundException
    int[] array = new int[5];
    array[10] = 42; // Выбросит ArrayIndexOutOfBoundsException
} catch (FileNotFoundException e) {
    System.err.println("Файл не найден: " + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
    System.err.println("Ошибка индекса массива: " + e.getMessage());
} catch (Exception e) {
    // Общий обработчик для всех остальных исключений
    System.err.println("Произошла непредвиденная ошибка: " + e.getMessage());
}

Важные правила:

  1. Специфичность прежде всего: Более конкретные исключения (например, FileNotFoundException) должны быть выше более общих (например, IOException или Exception).
  2. Недостижимый код: Компилятор выдаст ошибку, если более общее исключение будет перехватываться раньше более конкретного.
  3. Multi-catch (Java 7+): Можно перехватывать несколько типов исключений в одном блоке catch.
    catch (FileNotFoundException | SQLException e) {
        // Обработка двух разных, но не связанных наследованием, исключений
    }