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

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

Ответ

Checked исключение (наследник Exception, но не RuntimeException) следует создавать, когда:

  • Ситуация является ожидаемой частью бизнес-логики или работы с внешними системами, и от клиентского кода требуется обязательная реакция. Компилятор заставляет обработать такое исключение через try-catch или объявить в throws.
  • Существует разумный способ восстановления на уровне, где это исключение будет поймано.

Типичные случаи использования:

  1. Ошибки ввода-вывода: FileNotFoundException, IOException.
  2. Нарушение бизнес-правил, которое должен обработать вызывающий код (например, недостаточно средств на счете).
  3. Проблемы с конфигурацией или внешними сервисами (база данных недоступна, неверный формат файла).

Пример:

// Checked исключение для бизнес-ошибки
public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

public class BankAccount {
    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount > balance) {
            // Вызывающий код МОЖЕТ попробовать снять меньшую сумму
            throw new InsufficientFundsException("Недостаточно средств. Текущий баланс: " + balance);
        }
        balance -= amount;
    }
}

// Клиентский код вынужден обработать исключение
public void processPayment(BankAccount account, double amount) {
    try {
        account.withdraw(amount);
    } catch (InsufficientFundsException e) {
        // Восстановление: отправить уведомление пользователю
        notifyUser("Оплата не прошла: " + e.getMessage());
    }
}

Когда НЕ использовать: Для ошибок программиста (передан null, индекс за границами массива) или невосстановимых системных сбоев — здесь уместны unchecked исключения (RuntimeException).