当前位置: 首页 > 面试题库 >

在空引用上创建方法引用不会引发异常

江超英
2023-03-14
问题内容

是否有可能null在Java 引用上创建方法引用的原因 ?这样做可能永远是不正确的,但是会导致错误,以后很难找到:

public class Test {
    void m() {
    }

    public static void main(String[] args) {
        Test test = null;
        Runnable fn = test::m; // no exception
        System.out.println(fn); // prints Test$$Lambda$1/791452441@1c20c684
        fn.run(); // throws a null pointer exception
    }
}

问题答案:

是否有可能null在Java 引用上创建方法引用的原因 ?

不是
,但是Eclipse在这方面显然存在一个错误(编辑:此问题已得到修复)。根据规范,当您使用JDK的工具时,它会失败,并且Runnable fn = test::m;在线上会出现NPE 。

证明:http://ideone.com/APWXna(或编译和本地运行javacjava,而不是Eclipse的)

理论:摘自JLS§15.13.3:

首先,如果方法引用表达式以 ExpressionNamePrimary 开头,则将评估此子表达式。
如果子表达式的计算结果为nullNullPointerException则引发a,并且方法引用表达式突然完成。

(我的重点。)



 类似资料:
  • 问题内容: 我正在使用JAXB XMLadapter来编组和解组布尔值。C#应用程序也将访问该应用程序的XML文件。我们必须验证此XML文件,这是使用XSD完成的。C#应用程序为布尔节点写入“ True”值。但是我们的XSD确实验证了同样的结果,因为它只允许“ true / false”或“ 1/0”。因此,我们在XSD中将String保留为布尔值,并且XMLAdapter会验证该字符串是否在我们

  • 问题内容: 我用Java编写了这个程序 我读到在对象上调用方法会导致,但是上面的程序不是吗?为什么是这样?我是否理解不正确? 问题答案: 是一种方法。一个成员所属的类型,并且不需要一个实例来访问。 甲构件应该仅可以经由型表达访问。也就是说,你应该将其编写如下: Java确实允许你通过对象引用表达式访问成员,但这非常容易引起误解,因为这不是成员访问的实际语义。 通过对象引用表达式访问成员时,仅声明的

  • 我正在使用Mojang API从Minecraft玩家的用户名返回UUID。此方法在参数(我们想要知道UUID的播放器的用户名)中接受一个字符串。为了使用API的resultat,我使用SimpleJSON库(将JSON结果解析为要返回的字符串)。 我的方法抛出2个检查过的异常:IOExeption和Parse异常,因为我想要。当错误的用户名(因此不存在用户名)时,API返回一个空JSON对象,在

  • 我正在使用Spring In Action 3 Action学习Spring MVC,我已经实现了显示用户注册表的基本程序,一旦我们提交表单,它将使用进行验证。 这是我的Spring控制器: 这是我的Spitter类文件: 这是我的编辑。显示给用户注册的jsp文件: 要加载表单,我将访问URL为:,一旦表单被加载,我只需提交表单而无需输入任何详细信息,以便我可以检查我的表单是否得到验证。但是我得到

  • 我正在使用JAXB XMLadapter封送和反封送布尔值。应用程序的XML文件也将被C#应用程序访问。我们必须验证这个XML文件,这是使用XSD完成的。C#应用程序为布尔节点编写“true”值。但XSD也验证了这一点,因为它只允许“true/false”或“1/0”。因此,我们在XSD中保留了布尔值的String,该String将由XMLAdapter验证,以便在我们这边进行封送和反封送。XML