Что такое checked (проверяемое) исключение в Java?

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

Ответ

Checked исключение (проверяемое исключение) — это исключение, которое компилятор Java обязывает либо обработать в блоке try-catch, либо объявить в сигнатуре метода с помощью ключевого слова throws. Все checked исключения являются подклассами java.lang.Exception, но не java.lang.RuntimeException.

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

Пример 1: Объявление в throws

public String readFirstLineFromFile(String path) throws IOException {
    // FileReader может выбросить FileNotFoundException (checked)
    BufferedReader br = new BufferedReader(new FileReader(path));
    return br.readLine(); // readLine() может выбросить IOException
}

Пример 2: Обработка в try-catch

public String readFirstLineFromFile(String path) {
    try {
        BufferedReader br = new BufferedReader(new FileReader(path));
        return br.readLine();
    } catch (IOException e) { // Ловим checked исключение
        // Восстановление: возвращаем значение по умолчанию
        System.err.println("Could not read file: " + e.getMessage());
        return "";
    }
}
Сравнение с unchecked исключениями (RuntimeException): Критерий Checked Exception Unchecked Exception (RuntimeException)
Обработка Обязательна (компилятор проверяет) Не обязательна
Наследование Exception, но не RuntimeException RuntimeException
Тип ошибок Восстановимые, внешние условия (I/O, сеть) Ошибки программирования (NPE, индекс за границами)
Примеры IOException, SQLException, ClassNotFoundException NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException