Каковы преимущества и недостатки проверяемых исключений (checked exceptions) в Java?

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

Ответ

Проверяемые исключения (checked exceptions) в Java — это исключения, которые компилятор заставляет явно обрабатывать или пробрасывать. Их использование вызывает споры в сообществе.

Преимущества:

  • Принудительная обработка ошибок: Компилятор гарантирует, что разработчик предусмотрел возможные сбои, что повышает надежность кода.
  • Явный контракт: Сигнатура метода явно объявляет, какие исключения он может выбросить, что служит документацией.

Недостатки:

  • Избыточный код (boilerplate): Часто приводит к цепочкам try-catch или объявлениям throws, которые загромождают код, особенно когда исключение не может быть осмысленно обработано на текущем уровне.
  • Нарушение инкапсуляции: Вынуждает раскрывать детали реализации (типы исключений) вышележащим слоям.
  • Сложность с лямбда-выражениями: Функциональные интерфейсы в Stream API и других местах не поддерживают проверяемые исключения, что усложняет их использование.

Пример проверяемого исключения:

public void readFile(String path) throws IOException { // Должно быть объявлено
    BufferedReader reader = new BufferedReader(new FileReader(path));
    // ...
}

Современный подход: Для многих сценариев предпочтительнее использовать непроверяемые исключения (наследники RuntimeException), которые не требуют обязательного объявления. Это делает код чище, а обработку ошибок — более централизованной (например, через глобальный обработчик @ControllerAdvice в Spring). Проверяемые исключения остаются уместными для действительно ожидаемых и восстановимых ошибок (например, FileNotFoundException при работе с пользовательским вводом).