Что такое исключение (Exception) в Java и как его обрабатывать?

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

Ответ

Исключение (Exception) в Java — это событие, возникающее во время выполнения программы, которое нарушает нормальный поток инструкций. Механизм обработки исключений позволяет управлять ошибками и поддерживать стабильность приложения.

Типы исключений

  1. Checked Exceptions (проверяемые) — исключения, которые компилятор обязывает обрабатывать или объявлять в сигнатуре метода (throws). Возникают в предсказуемых ситуациях (например, ввод-вывод).
    • Пример: IOException, SQLException.
  2. Unchecked Exceptions (непроверяемые / RuntimeException) — исключения, которые не требуется объявлять. Часто указывают на ошибки программирования.
    • Пример: NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException.
  3. Errors — критические системные ошибки, которые приложение обычно не должно пытаться обрабатывать.
    • Пример: OutOfMemoryError, StackOverflowError.

Блоки обработки исключений

try {
    // Код, который может выбросить исключение
    FileInputStream file = new FileInputStream("nonexistent.txt");
} catch (FileNotFoundException e) {
    // Обработка конкретного исключения
    System.err.println("Файл не найден: " + e.getMessage());
} catch (IOException e) {
    // Обработка более общего исключения
    System.err.println("Ошибка ввода-вывода");
} finally {
    // Этот блок выполняется всегда, даже если было исключение
    // Используется для освобождения ресурсов (закрытие файлов, соединений)
    System.out.println("Завершение операции с файлом.");
}

Лучшие практики

  • Используйте конкретные типы исключений в catch, а не общий Exception.
  • Не игнорируйте исключения пустыми catch-блоками.
  • Логируйте исключения с помощью логгеров (SLF4J, Log4j).
  • Создавайте собственные исключения, наследуясь от Exception (для проверяемых) или RuntimeException.
  • Используйте try-with-resources для автоматического закрытия ресурсов, реализующих AutoCloseable.
    try (FileReader fr = new FileReader("file.txt");
         BufferedReader br = new BufferedReader(fr)) {
        // Использование ресурсов
    } // Ресурсы закроются автоматически