Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как проверить аргументы метода

Короткий ответ

Проверяйте аргументы в начале метода и выбрасывайте 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 150

null

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 — Возникает при обращении к списку или строке по индексу вне допустимого диапазона.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.