Как проверить аргументы метода
Короткий ответ
Проверяйте аргументы в начале метода и выбрасывайте IllegalArgumentException с понятным сообщением:
double discount(double price, int percent) {
if (percent < 0 || percent > 100) {
throw new IllegalArgumentException("percent must be 0..100, got " + percent);
}
return price * percent / 100;
}
void main() {
IO.println(discount(80, 25));
IO.println(discount(80, 150));
}Результат:
20.0
Exception in thread "main" java.lang.IllegalArgumentException: percent must be 0..100, got 150null
Objects.requireNonNull() проверяет ссылку и возвращает её — проверку можно совместить с присваиванием:
class Greeter {
private final String name;
Greeter(String name) {
this.name = Objects.requireNonNull(name, "name");
}
}
void main() {
new Greeter("Anna");
IO.println("ok");
new Greeter(null);
}Результат:
ok
Exception in thread "main" java.lang.NullPointerException: nameИндексы
Objects.checkIndex() проверяет, что индекс в пределах [0, length):
void main() {
int[] slots = new int[3];
IO.println(Objects.checkIndex(2, slots.length));
Objects.checkIndex(3, slots.length);
}Результат:
2
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3Состояние объекта
Если неверен не аргумент, а состояние объекта, используйте IllegalStateException:
class Order {
boolean paid;
void ship() {
if (!paid) {
throw new IllegalStateException("order is not paid yet");
}
}
}
void main() {
new Order().ship();
}Результат:
Exception in thread "main" java.lang.IllegalStateException: order is not paid yetЧастая ошибка
Возвращать «специальные» значения вроде -1 или null при неверных аргументах. Вызывающий код легко забывает их проверить, и ошибка всплывает позже в другом месте. Исключение останавливает программу сразу, там, где ошибка возникла.
Функции из этого ответа
- Objects.requireNonNull() — Проверяет, что значение не null, и сразу бросает NullPointerException с понятным сообщением.
- IllegalArgumentException — Сообщает, что метод получил недопустимый аргумент.
- IndexOutOfBoundsException — Возникает при обращении к списку или строке по индексу вне допустимого диапазона.