Читая исходный код JDK, я обнаружил, что автор обычно проверяет параметры, если они равны NULL, а затем вручную генерирует новый NullPointerException (). Почему они это делают? Я думаю, что нет необходимости делать это, так как он вызовет новый NullPointerException () при вызове любого метода. (Вот некоторый исходный код HashMap, например :)
public V computeIfPresent(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
if (remappingFunction == null)
throw new NullPointerException();
Node<K,V> e; V oldValue;
int hash = hash(key);
if ((e = getNode(hash, key)) != null &&
(oldValue = e.value) != null) {
V v = remappingFunction.apply(key, oldValue);
if (v != null) {
e.value = v;
afterNodeAccess(e);
return v;
}
else
removeNode(hash, key, null, false, true);
}
return null;
}
java
nullpointerexception
LiJiaming
источник
источник
ArgumentNullException
в подобных случаях (а неNullReferenceException
) - на самом деле это действительно хороший вопрос о том, почему вы бы поднялиNullPointerException
здесь явно (а не другой).IllegalArgumentException
илиNullPointerException
для пустого аргумента. Конвенция JDK является последней.Ответы:
Есть несколько причин, которые приходят на ум, некоторые из них тесно связаны:
Отказоустойчивый: если он потерпит неудачу, лучше всего потерпеть неудачу раньше, чем позже. Это позволяет обнаруживать проблемы ближе к их источнику, облегчая их выявление и устранение. Это также позволяет избежать бесполезной траты циклов ЦП на код, который обязательно завершится с ошибкой.
Намерение: создание исключения в явном виде дает понять сопровождающим, что ошибка существует намеренно, и автору было известно о последствиях.
Согласованность: если допустить, что ошибка произошла естественным образом, она может возникнуть не в каждом сценарии. Например, если сопоставление не найдено,
remappingFunction
оно никогда не будет использовано, и исключение не будет выдано. Предварительная проверка ввода позволяет получить более детерминированное поведение и более четкую документацию .Стабильность: код развивается со временем. Код, который встречает исключение, может, после некоторого рефакторинга, перестать делать это или делать это при других обстоятельствах. Бросив его явно, вы уменьшите вероятность непреднамеренного изменения поведения.
источник
new NullPointerException(message)
конструктор, чтобы уточнить, что является пустым. Хорошо для людей, которые не имеют доступа к вашему исходному коду. Они даже сделали это однострочным в JDK 8 с помощьюObjects.requireNonNull(object, message)
служебного метода.