【发布时间】:2017-10-11 05:34:03
【问题描述】:
在阅读JDK源码时,发现作者经常会检查参数是否为null,然后手动抛出new NullPointerException()。 他们为什么这样做?我认为没有必要这样做,因为它会在调用任何方法时抛出 new 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;
}
【问题讨论】:
-
编码的一个关键点是意图
-
这是你第一个问题的一个很好的问题!我做了一些小的修改;我希望你不要介意。我还删除了谢谢和关于它是你的第一个问题的注释,因为通常这类事情不是 SO 问题的一部分。
-
我是 C#,惯例是在这种情况下提出
ArgumentNullException(而不是NullReferenceException)——这实际上是一个非常好的问题,为什么要明确提出NullPointerException在这里(而不是另一个)。 -
@EJoshuaS 这是一个old debate 是否抛出
IllegalArgumentException或NullPointerException作为空参数。 JDK约定是后者。 -
真正的问题是他们抛出一个错误和throw away all information that led to this error。似乎这是IS the actual 源代码。甚至连简单的血腥字符串消息都没有。伤心。