Всегда ли возникает ошибка компиляции, если не обработать исключение, объявленное в `throws` вызываемого метода?

«Всегда ли возникает ошибка компиляции, если не обработать исключение, объявленное в `throws` вызываемого метода?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, не всегда. Ошибка компиляции возникает только для проверяемых исключений (checked exceptions).

Правило:

  • Если метод объявляет в throws проверяемое исключение (наследник Exception, но не RuntimeException), то вызывающий код обязан либо обработать его в блоке try-catch, либо объявить в своем собственном throws.
  • Если метод объявляет в throws непроверяемое исключение (unchecked exception) (наследник RuntimeException или Error), компилятор не требует его обработки или объявления.

Пример, иллюстрирующий разницу:

// 1. Checked exception - ОБЯЗАТЕЛЬНА обработка или объявление
public void readConfig() throws IOException { // IOException - checked
    Files.readAllLines(Paths.get("config.cfg"));
}

public void caller1() {
    readConfig(); // ОШИБКА КОМПИЛЯЦИИ: Unhandled exception: IOException
}

public void caller2() throws IOException { // Решение: объявить в своем throws
    readConfig();
}

// 2. Unchecked exception - обработка НЕ ОБЯЗАТЕЛЬНА
public void parseNumber(String str) throws NumberFormatException { // RuntimeException - unchecked
    Integer.parseInt(str);
}

public void caller3() {
    parseNumber("abc"); // НЕТ ошибки компиляции, даже если исключение может быть выброшено
}

Вывод: Ключевое значение имеет тип исключения (checked/unchecked), а не сам факт его объявления в throws.