В чем разница между проверяемыми (checked) и непроверяемыми (unchecked) исключениями в Java?

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

Ответ

Проверяемые исключения (checked exceptions) — это исключения, которые компилятор Java обязывает обрабатывать или объявлять. Они наследуются от java.lang.Exception (но не от RuntimeException).

Непроверяемые исключения (unchecked exceptions) — это исключения, обработка которых не требуется компилятором. К ним относятся:

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

Почему такое разделение? Проверяемые исключения предназначены для восстановимых условий, которые программа должна предвидеть (например, отсутствие файла). Непроверяемые — для ошибок программирования или фатальных сбоев.

Пример на практике:

// Проверяемое исключение: ОБЯЗАТЕЛЬНА обработка или объявление 'throws'
try {
    FileInputStream fis = new FileInputStream("missing.txt");
} catch (FileNotFoundException e) { // Компилятор требует этот блок
    System.err.println("Файл не найден: " + e.getMessage());
}

// Непроверяемое исключение: обработка НЕ обязательна
String text = null;
// Компилятор не ругается, но в runtime упадет NullPointerException
// System.out.println(text.length());