java – 为什么显式抛出NullPointerException而不是让它自然发生?

在阅读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;
}

解决方法:

有几个原因浮现在脑海中,有几个原因密切相关:

快速失败:如果它失败了,最好早点而不是晚点失败.这样可以使问题更接近其来源,从而更容易识别和恢复.它还可以避免在必然会失败的代码上浪费CPU周期.

意图:明确地抛出异常使维护者清楚地知道错误是故意的,并且作者意识到了后果.

一致性:如果允许错误自然发生,则可能不会在每个方案中发生.例如,如果没有找到映射,则永远不会使用remappingFunction,也不会抛出异常.预先验证输入允许更确定的行为并且更清晰documentation.

稳定性:代码随着时间的推移而发展在经过一些重构后,遇到异常的代码可能会停止这样做,或者在不同情况下这样做.明确地抛出它会使行为不太可能无意中发生变化.

上一篇:java – 在onFilterTouchEventForSecurity上获取NullPointerException


下一篇:java – AndroidStudio Calendar.get(Calendar.DAY_OF_MONTH)nullPointer异常