Checked exceptions в Java: что означает throws
💻 Информатика · 11 класс
Как выбрать между обработкой и передачей исключения и не путать throws с throw.

Что проверяет компилятор
Checked exceptions — классы исключений, для которых Java проверяет возможность обработки или объявления при компиляции. Подклассы RuntimeException и Error относятся к непроверяемым; остальные типы исключений в соответствующей иерархии требуют соблюдения правил проверки. Утверждение «checked возникает во время компиляции» неверно: само исключение может возникнуть при выполнении, а заранее проверяется контракт кода.
Два допустимых решения
Если вызов может привести к проверяемому исключению, метод либо перехватывает его подходящим catch, либо объявляет передачу через throws. Это не освобождает от решения, кто в итоге должен сообщить об ошибке или восстановить работу.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
static String readText(Path file) throws IOException {
return Files.readString(file);
}В примере метод сообщает вызывающему коду: чтение может завершиться IOException. Здесь показан метод для размещения внутри класса, а не готовый файл с отдельной функцией верхнего уровня. Для Files.readString нужен JDK11 или новее.
Разобранный вызов
try {
String text = readText(Path.of("notes.txt"));
System.out.println(text);
} catch (IOException ex) {
System.out.println("Cannot read the file");
}Если файл успешно прочитан, печатается его содержимое. Если произошла ошибка ввода-вывода, например файл отсутствует, выбирается обработчик. Конкретное содержимое вывода заранее неизвестно без файла: нельзя приписать этому коду фиксированную строку результата.
Throw и throws
throw — инструкция, которая выбрасывает конкретный объект: throw new IOException("Read failed");. throws IOException — часть объявления метода, описывающая возможную передачу исключения. Декларация сама ничего не выбрасывает и не исправляет.
Если переопределяете метод, нельзя произвольно расширить набор его проверяемых исключений. Вызывающий код опирается на исходный контракт. Сужение до подкласса или отсутствие checked exception часто допустимо, но детали зависят от сигнатур.
Задания
- Метод вызывает Files.readString и не содержит catch или throws. Какую проблему обнаружит компилятор?
- Исправляет ли добавление throws IOException отсутствие файла на диске?
- Чем отличаются throw new IOException(...) и throws IOException?
Ответы
1. Проверяемое IOException не обработано и не объявлено. Нужно выбрать подходящий уровень ответственности. 2. Нет: изменился контракт метода, а не состояние файловой системы. Ошибка по-прежнему может возникнуть при выполнении. 3. Throw выполняет действие с объектом исключения; throws объявляет возможность передачи.
Частые ошибки
Не добавляйте throws Exception повсюду только ради исчезновения сообщения компилятора. Слишком широкий контракт затрудняет понимание того, что действительно может произойти. Не заменяйте ошибку чтения пустой строкой без согласованного смысла: настоящий пустой файл и невозможность чтения — разные ситуации.
Для практики сначала проверьте успешное чтение небольшого файла, затем отсутствие файла. Сравните поведение и объясните, на каком уровне программы пользователь получает понятный результат. Это проверка обработки, а не обещание успешного чтения при любых условиях.