Ответ
Да, можно. Для этого класс исключения должен наследоваться от java.lang.Exception (но не от RuntimeException). Компилятор будет требовать его обработки (через try-catch) или объявления в throws.
Пример создания и использования:
// 1. Объявление проверяемого исключения
class PaymentFailedException extends Exception {
// Конструкторы для передачи сообщения и причины
public PaymentFailedException(String message) {
super(message);
}
public PaymentFailedException(String message, Throwable cause) {
super(message, cause);
}
}
// 2. Использование в методе (обязательно объявить в throws)
class PaymentService {
public void processPayment(double amount) throws PaymentFailedException {
if (amount <= 0) {
// Выбрасываем исключение — вызывающий код должен его обработать
throw new PaymentFailedException("Invalid amount: " + amount);
}
// Логика оплаты...
}
}
// 3. Обработка исключения в вызывающем коде
class Main {
public static void main(String[] args) {
PaymentService service = new PaymentService();
try {
service.processPayment(-100);
} catch (PaymentFailedException e) {
System.err.println("Payment error: " + e.getMessage());
// Восстановление после ошибки
}
}
}
Когда использовать: Для ошибок, которые являются восстановимыми, и вы хотите обязать вызывающий код явно их обработать (например, ошибки ввода, сетевые сбои, бизнес-логика).