Ответ
Checked исключение (наследник Exception, но не RuntimeException) следует создавать, когда:
- Ситуация является ожидаемой частью бизнес-логики или работы с внешними системами, и от клиентского кода требуется обязательная реакция. Компилятор заставляет обработать такое исключение через
try-catchили объявить вthrows. - Существует разумный способ восстановления на уровне, где это исключение будет поймано.
Типичные случаи использования:
- Ошибки ввода-вывода:
FileNotFoundException,IOException. - Нарушение бизнес-правил, которое должен обработать вызывающий код (например, недостаточно средств на счете).
- Проблемы с конфигурацией или внешними сервисами (база данных недоступна, неверный формат файла).
Пример:
// 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).