Ответ
Нет, не всегда. Ошибка компиляции возникает только для проверяемых исключений (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.