Что такое исключение (Exception) в Java?

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

Ответ

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

Иерархия: Все исключения являются подклассами Throwable. Два основных подтипа:

  • Error: Критические, невосстанавливаемые ошибки системы (например, OutOfMemoryError). Обычно не перехватываются.
  • Exception: Исключительные ситуации, которые программа может и должна обрабатывать.
    • Проверяемые (Checked) исключения: Наследники Exception (кроме RuntimeException). Компилятор требует их обработки (try-catch) или объявления в throws. Пример: IOException, SQLException.
    • Непроверяемые (Unchecked) исключения: Наследники RuntimeException. Возникают из-за логических ошибок программиста. Обработка не обязательна. Пример: NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException.

Базовый шаблон обработки:

try {
    // Код, который может выбросить исключение
    FileInputStream fis = new FileInputStream("file.txt");
    int data = fis.read();
} catch (FileNotFoundException e) {
    // Обработка конкретного исключения
    System.err.println("Файл не найден: " + e.getMessage());
} catch (IOException e) {
    // Обработка более общего исключения
    System.err.println("Ошибка ввода-вывода.");
} finally {
    // Код, выполняющийся всегда (например, для закрытия ресурсов)
    if (fis != null) fis.close();
}

Принципы использования:

  • Используйте проверяемые исключения для ожидаемых ошибок, от которых можно восстановиться.
  • Используйте непроверяемые исключения для ошибок программирования (предусловия, инварианты).
  • Предпочитайте специфичные исключения более общим.
  • В catch-блоках либо восстановите состояние, либо залогируйте ошибку и пробросьте её дальше.