Ответ
Checked исключения (Exception и его подклассы, кроме RuntimeException) — спорная фича Java, имеющая как преимущества, так и недостатки.
Аргументы ЗА (преимущества):
- Принудительная обработка ошибок: компилятор заставляет разработчика явно обработать (
try-catch) или пробросить (throws) исключение, что повышает надежность кода. - Явный контракт: сигнатура метода документирует возможные ошибки.
Аргументы ПРОТИВ (недостатки):
- Усложнение кода: приводит к «утечке» исключений через множество уровней абстракции, нарушая инкапсуляцию.
- Избыточность: часто приводит к пустым
catch-блокам или обертыванию вRuntimeException, что сводит на нет первоначальную идею. - Проблемы с лямбда-выражениями: checked исключения плохо сочетаются с функциональными интерфейсами Java 8+.
Современная практика (например, в Spring):
Часто используют только unchecked исключения (RuntimeException), перекладывая ответственность за глобальную обработку на уровень контроллера или AOP-аспекта.
// Старый подход с checked исключением (усложняет цепочку вызовов)
public void readFile() throws IOException {
Files.readAllBytes(Paths.get("file.txt"));
}
// Современный подход: обертка в unchecked исключение
public void readFile() {
try {
Files.readAllBytes(Paths.get("file.txt"));
} catch (IOException e) {
// Пробрасываем unchecked исключение с сохранением причины
throw new RuntimeException("Failed to read file", e);
}
}
Вывод: Если бы Java проектировалась сегодня, checked исключения, вероятно, не были бы включены. Однако их удаление из существующей Java невозможно без потери обратной совместимости.