java - 方法引用表达式评估中空检查背后的原因是什么?

标签 java java-8 nullpointerexception method-reference

在很多问题中,人们已经意识到使用计算结果为 null 值的表达式创建方法引用将导致 NullPointerException。例如:

String s = null;
Supplier<char[]> fun = s::toCharArray;

这是由于 java 规范中的以下段落:

First, if the method reference expression begins with an ExpressionName or a Primary, this subexpression is evaluated. If the subexpression evaluates to null, a NullPointerException is raised, and the method reference expression completes abruptly. If the subexpression completes abruptly, the method reference expression completes abruptly for the same reason.

现在我的问题是,有没有人碰巧知道这个(基于许多令人困惑的问题)违反直觉的规范背后的原因是什么?

我唯一想到的是,在下面的情况下,如果在 Supplier 的评估期间发生 NullPointerException 的错误,则很难准确报告错误>:

public static char[] callback(Supplier<char[]> supplier) {
    return supplier.get();
}

public static void main(String[] args) {
    String s = null;
    callback(s::toCharArray);
}

最佳答案

这里的原因是当您创建非静态方法引用时,它必须能够访问this。当您尝试创建对 null 对象的引用时,任何地方都没有 this ,这就是为什么它应该在这一步失败,而不是在第一次使用时在代码中的某个地方失败.

想象一下,您在一个地方获取对象,将其方法引用保存在某处,然后在完全不同的代码部分中使用它。您会得到一个 NPE,它不在发生错误的地方,而是在许多代码行之外。

关于java - 方法引用表达式评估中空检查背后的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53744111/

相关文章:

java - 为什么在 Java 8 中向接口(interface)添加默认方法是一个不错的设计选择,有哪些替代方案

java - SNMP协议(protocol)中的NullPointerException

java - 相机对象总是返回 null

java - Struts 和 bean

java - transient 如何在序列化 Java 中与 final 一起工作

java - 如何在Java 8中传递多个参数和一个函数,然后执行带参数的函数?

java - 从命名的 yaml 属性列表中读取字符串数组作为常量?

java - 在 Eclipse 中预览长连接字符串

java - catch block 中的空指针

java - "Error:cannot generate view binders java.lang.NullPointerException"的可能原因