На какие два основных типа делятся исключения (Exception) в Java?

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

Ответ

В Java исключения делятся на проверяемые (checked) и непроверяемые (unchecked).

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

Пример кода:

// Проверяемое исключение (Checked) - обязательно обработать
public String readFile(String path) throws IOException {
    // Метод объявляет, что может выбросить IOException
    return Files.readString(Path.of(path));
}

// Непроверяемое исключение (Unchecked) - обработка не обязательна
public void calculate(int divisor) {
    if (divisor == 0) {
        // ArithmeticException является RuntimeException (unchecked)
        throw new ArithmeticException("Division by zero");
    }
    int result = 10 / divisor;
}