Предположим, что у нас есть метод:
1 2 |
public void method1(String arg1) { } |
Нам нужно сделать так, чтобы при передаче null в качестве значения параметра arg1 бросалось исключение. Но какое исключение выбрать? С одной стороны, логически очень подходит исключение InvalidArgumentException, но с другой стороны NullPointerException тоже подходит. Оба исключения относятся к непроверяемым исключениям. И оба подходят к данной ситуации по смыслу.
Иногда на эту тему разгораются целые холивары. Но я думаю, что в данном случае лучше посмотреть, какое исключение бросают в подобных случаях методы в стандартных классах Java. Например, класс Collections бросает в таких случаях исключение NullPointerException, о чём и написано в JavaDoc. Точно также поступает и класс FileInputStream, о чём тоже написано в его JavaDoc. Таким образом, получаем, что лучше нам соблюдать этот обычай и делать проверку вот так:
1 2 3 4 5 |
public void method1(String arg1) { if (arg1 == null) { throw new NullPointerException("arg1"); } } |
Вы можете также использовать метод requireNonNull у класса java.util.Objects, который тоже бросает NullPointerException. Следующий код эквивалентен предыдущему:
1 2 3 4 |
public void method1(String arg1) { java.util.Objects.requireNonNull(arg1, "arg1"); // Можно без строки с сообщением: Objects.requireNonNull(arg1); } |
Вывод: При проверке переданных аргументов на null бросайте NullPointerException, а не IllegalArgumentException. Лучше всего будет, если вы будете использовать метод requireNonNull у класса java.util.Objects.
Тут вопрос религии и идеологии, а не технологии?
Здесь играет роль семантика ситуации.
IllegalArgumentException нужен тогда, когда аргумент метода по смыслу не подходит. Например, вы пишете метод, который принимает делимое и делитель.
public int div(int divident, int divisior){
if(divisior == 0){
throw new IllegalArgumentException(«Divisior cant be zero» );
return divident/divisior;
}
IllegalArgumentException здесь говорит о том, что поданный аргумент семантически не верный.
А NPE должен бросаться только если в метод передали null.