Какое стандартное исключение в Java следует использовать, если переданный в метод аргумент недопустим для бизнес-логики сервиса?

Ответ

Следует использовать 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 идеален, как хуй в пальто.