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

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

Ответ

Проверяемые исключения не рекомендуется использовать в следующих случаях:

1. Для невосстановимых ошибок:

  • OutOfMemoryError, StackOverflowError
  • Ошибки виртуальной машины
  • Почему: Их обработка бессмысленна, программа не может продолжить работу.

2. В слоях доступа к данным (DAO/Repository):

// Плохо: пробрасывает SQLException
public User findById(int id) throws SQLException { ... }

// Лучше: обернуть в RuntimeException
public User findById(int id) {
    try {
        // JDBC код
    } catch (SQLException e) {
        throw new DataAccessException("Database error", e);
    }
}

3. В лямбда-выражениях и Stream API:

  • Функциональные интерфейсы не объявляют проверяемых исключений
  • Приводит к громоздкому коду с try-catch внутри лямбд

4. В библиотечных API:

  • Навязывает обработку исключений всем клиентам
  • Усложняет использование библиотеки
  • Пример: Spring предпочитает непроверяемые исключения

5. Когда вызывающий код не может осмысленно обработать ошибку:

  • Если обработка сводится только к логированию и повторному пробросу
  • Если ошибка должна всплыть на верхний уровень для единообразной обработки

Общее правило: Используйте проверяемые исключения только тогда, когда ожидаете, что вызывающий код сможет восстановиться или предпринять осмысленные действия при обработке ошибки.