Рубрики
Без рубрики

Исключение IllegalArgumentException или исключение NullPointerException для параметра Null?

Изучите вопрос о том, какое исключение следует создавать, когда кто-то передает нулевой параметр одному из наших методов: IllegalArgumentExcpetion или NullPointerException.

Автор оригинала: Amy DeGregorio.

1. введение

Среди решений, которые мы принимаем при написании наших приложений, многие касаются того, когда создавать исключения и какой тип создавать.

В этом кратком руководстве мы рассмотрим вопрос о том, какое исключение следует создавать, когда кто-то передает параметр null одному из наших методов: IllegalArgumentException или NullPointerException .

Мы рассмотрим эту тему, изучив аргументы обеих сторон.

2. Исключение IllegalArgumentException

Во-первых, давайте рассмотрим аргументы для создания исключения IllegalArgumentException .

Давайте создадим простой метод, который вызывает исключение IllegalArgumentException при передаче null :

public void processSomethingNotNull(Object myParameter) {
    if (myParameter == null) {
        throw new IllegalArgumentException("Parameter 'myParameter' cannot be null");
    }
}

Теперь давайте перейдем к аргументам в пользу IllegalArgumentException .

2.1. Это то, Как Javadoc Говорит использовать Его

Когда мы читаем Javadoc для IllegalArgumentException , он говорит, что он предназначен для использования, когда незаконное или неподходящее значение передается методу . Мы можем считать объект null незаконным или неуместным, если наш метод его не ожидает, и это было бы подходящим исключением для нас.

2.2. Он Соответствует Ожиданиям Разработчиков

Далее давайте подумаем о том, как мы, разработчики, думаем, когда видим следы стека в наших приложениях. Очень распространенным сценарием, в котором мы получаем исключение NullPointerException , является случайная попытка доступа к объекту null . В этом случае мы собираемся проникнуть как можно глубже в стек, чтобы увидеть, на что мы ссылаемся, это null .

Когда мы получаем исключение IllegalArgumentException , мы, скорее всего, предположим, что передаем методу что-то неправильное. В этом случае мы поищем в стеке самый нижний метод, который мы вызываем, и начнем отладку оттуда. Если мы рассмотрим этот способ мышления, исключение IllegalArgumentException приведет нас в наш стек ближе к тому месту, где была допущена ошибка.

2.3. Другие Аргументы

Прежде чем перейти к аргументам в пользу NullPointerException , давайте рассмотрим несколько небольших моментов в пользу IllegalArgumentException . Некоторые разработчики считают, что только JDK должен выбрасывать NullPointerException . Как мы увидим в следующем разделе, Javadoc не поддерживает эту теорию. Другой аргумент заключается в том, что более последовательно использовать IllegalArgumentException , поскольку это то, что мы использовали бы для других незаконных значений параметров.

3. Исключение NullPointerException

Далее рассмотрим аргументы для NullPointerException .

Давайте создадим пример, который вызывает исключение NullPointerException :

public void processSomethingElseNotNull(Object myParameter) {
    if (myParameter == null) {
        throw new NullPointerException("Parameter 'myParameter' cannot be null");
    }
}

3.1. Это то, Как Javadoc Говорит использовать Его

Согласно Javadoc для NullPointerException , NullPointerException предназначено для использования при попытке использовать null там, где требуется объект . Если наш параметр метода не предназначен для null , то мы могли бы разумно рассматривать это как требуемый объект и выбросить исключение NullPointerException .

3.2. Это согласуется с API JDK

Давайте на минутку задумаемся о многих распространенных методах JDK, которые мы вызываем во время разработки. Многие из них бросают NullPointerException , если мы предоставляем null . Кроме того, Objects.requireNonNull() вызывает исключение |/NullPointerException , если мы передаем null. Согласно документации Objects , он существует в основном для проверки параметров.

В дополнение к методам JDK , которые выбрасывают NullPointerException , мы можем найти другие примеры конкретных типов исключений, выбрасываемых из методов в API коллекций. ArrayList.addAll(индекс, коллекция) создает исключение IndexOutOfBoundsException , если индекс находится за пределами размера списка, и создает исключение NullPointerException , если коллекция null . Существует два очень специфических типа исключений, а не более общий IllegalArgumentException .

Мы могли бы рассмотреть IllegalArgumentException предназначен для случаев, когда у нас нет более конкретного типа исключения, доступного нам.

4. Заключение

Как мы видели в этом уроке, это вопрос, на который нет четкого ответа. Документация по этим двум исключениям, по-видимому, пересекается в том, что, когда они взяты отдельно, они оба звучат уместно. Существуют также дополнительные убедительные аргументы для обеих сторон, основанные на том, как разработчики выполняют отладку, и на шаблонах, наблюдаемых в самих методах JDK.

Какое бы исключение мы ни выбрали, мы должны быть последовательны на протяжении всего нашего приложения. Кроме того, мы можем сделать наши исключения более полезными, предоставив конструктору исключений значимую информацию. Например, наши приложения будет легче отлаживать, если мы предоставим имя параметра в сообщении об исключении.

Как всегда, пример кода доступен на GitHub .