Какие основные механизмы обработки исключений (Exception Handling) существуют в Java?

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

Ответ

Java предоставляет следующие ключевые механизмы для обработки исключений:

  1. Блок try-catch. Базовый механизм для перехвата и обработки исключений.

    try {
        FileReader file = new FileReader("data.txt");
    } catch (FileNotFoundException e) {
        System.err.println("Файл не найден: " + e.getMessage());
        // Восстановление или логирование
    }
  2. Блок finally. Гарантирует выполнение кода (например, для освобождения ресурсов) независимо от того, было выброшено исключение или нет.

    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader("file.txt"));
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try { br.close(); } catch (IOException e) { /* игнорируем */ }
        }
    }
  3. Оператор throws. Объявляет, что метод может выбросить проверяемое исключение (checked exception), не обрабатывая его внутри.

    public void readConfig() throws IOException, ConfigurationException {
        // Код, который может вызвать эти исключения
    }
  4. Оператор try-with-resources (с Java 7). Автоматически закрывает ресурсы, реализующие интерфейс AutoCloseable. Устраняет шаблонный код и потенциальные утечки.

    try (FileInputStream fis = new FileInputStream("file.txt");
         BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
        System.out.println(br.readLine());
    } // fis и br будут закрыты автоматически здесь
  5. Multi-catch (с Java 7). Позволяет перехватывать несколько типов исключений в одном блоке catch.

    try {
        // код, который может выбросить разные исключения
    } catch (IOException | SQLException e) {
        // Обработка для обоих типов исключений
        logger.log(Level.SEVERE, "Ошибка ввода-вывода или БД", e);
    }
  6. Создание пользовательских исключений. Наследование от Exception (проверяемое) или RuntimeException (непроверяемое).

    public class InsufficientFundsException extends RuntimeException {
        public InsufficientFundsException(String message) {
            super(message);
        }
    }