Java: NullPointerException или InvalidArgumentException

Предположим, что у нас есть метод:

Нам нужно сделать так, чтобы при передаче null в качестве значения параметра arg1 бросалось исключение. Но какое исключение выбрать? С одной стороны, логически очень подходит исключение InvalidArgumentException, но с другой стороны NullPointerException тоже подходит. Оба исключения относятся к непроверяемым исключениям. И оба подходят к данной ситуации по смыслу.

Иногда на эту тему разгораются целые холивары. Но я думаю, что в данном случае лучше посмотреть, какое исключение бросают в подобных случаях методы в стандартных классах Java. Например, класс Collections бросает в таких случаях исключение NullPointerException, о чём и написано в JavaDoc. Точно также поступает и класс FileInputStream, о чём тоже написано в его JavaDoc. Таким образом, получаем, что лучше нам соблюдать этот обычай и делать проверку вот так:

Вы можете также использовать метод requireNonNull у класса java.util.Objects, который тоже бросает NullPointerException. Следующий код эквивалентен предыдущему:

Вывод: При проверке переданных аргументов на null бросайте NullPointerException, а не IllegalArgumentException. Лучше всего будет, если вы будете использовать метод requireNonNull у класса java.util.Objects.

 

Java: NullPointerException или InvalidArgumentException: 2 комментария

  1. Здесь играет роль семантика ситуации.

    IllegalArgumentException нужен тогда, когда аргумент метода по смыслу не подходит. Например, вы пишете метод, который принимает делимое и делитель.

    public int div(int divident, int divisior){
    if(divisior == 0){
    throw new IllegalArgumentException(«Divisior cant be zero» );
    return divident/divisior;
    }

    IllegalArgumentException здесь говорит о том, что поданный аргумент семантически не верный.

    А NPE должен бросаться только если в метод передали null.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *