Ответ
Следует использовать IllegalArgumentException. Это стандартное непроверяемое исключение (RuntimeException), которое ясно указывает на то, что переданный аргумент имеет некорректное или недопустимое значение с точки зрения логики метода.
Пример:
public void validateAndProcess(Order order) {
if (order == null) {
throw new IllegalArgumentException("Order cannot be null");
}
if (order.getTotalAmount().signum() <= 0) {
throw new IllegalArgumentException(
"Order total must be positive. Received: " + order.getTotalAmount()
);
}
// Дальнейшая обработка
}
Почему именно оно:
- Стандартное и понятное: Часть JDK, его семантика известна всем Java-разработчикам.
- Непроверяемое: Ошибка программиста или клиента API, не требует обязательного объявления в
throws. - Информативное: Позволяет передать детальное сообщение о причине ошибки.
Для более специфичных сценариев (например, «Заказ уже обработан») следует создавать собственные бизнес-исключения, наследуясь от RuntimeException.
Ответ 18+ 🔞
Ну вот смотри, как обычно бывает: пишешь ты метод, а тебе туда какую-то хуйню подсовывают. Нулевой объект, отрицательную сумму, или вообще строку, где должна быть цифра. И что делать? Правильно, послать этого гонца нахуй с понятным объяснением.
Вот тут-то и выходит на сцену наш старый добрый IllegalArgumentException. Это как крикнуть: «Э, ты, мудак, что мне подсунул?!». Исключение непроверяемое (RuntimeException), то есть объявлять его в throws не надо — это ошибка того, кто метод вызывает, а не твоя.
Смотри, как это выглядит в деле:
public void validateAndProcess(Order order) {
if (order == null) {
throw new IllegalArgumentException("Order cannot be null");
}
if (order.getTotalAmount().signum() <= 0) {
throw new IllegalArgumentException(
"Order total must be positive. Received: " + order.getTotalAmount()
);
}
// Если дожили сюда, можно работать дальше
}
А почему именно оно, это исключение? Да всё просто, ёпта:
- Все его знают. Это часть самой Java, классика жанра. Любой разработчик, увидев
IllegalArgumentException, сразу понимает — аргумент кривой. - Непроверяемое. Не нужно заморачиваться с
throwsв сигнатуре. Это ошибка использования твоего кода, пусть вызывающая сторона и думает, как её обработать. - Можно внятно объяснить. В сообщении можно написать, что именно не так: «сумма должна быть положительной, а ты мне -100 прислал, идиот».
Ну а если у тебя случай совсем уж специфический, бизнес-логический — типа «заказ уже оплачен» или «пользователь заблокирован» — тогда да, делай своё исключение. Наследуйся от RuntimeException и называй его, например, OrderAlreadyProcessedException. Но для простого «аргумент — говно» — IllegalArgumentException идеален, как хуй в пальто.