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

Java 在空引用上创建方法引用不会引发异常,java,eclipse,nullpointerexception,null,java-8,Java,Eclipse,Nullpointerexception,Null,Java 8,是否有可能在一个对象上创建方法引用的原因 nullJava中的引用?这样做可能永远不会正确,但会导致以后很难发现的错误: public class Test { void m() { } public static void main(String[] args) { Test test = null; Runnable fn = test::m; // no exception System.out.println(fn

是否有可能在一个对象上创建方法引用的原因
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
    }
}
有没有理由可以在Java中的
null
引用上创建方法引用

它不是,但显然Eclipse在这方面有一个bug(编辑:从那以后就有了)。根据规范,当您使用JDK工具时,它会在
Runnable fn=test::m

证明:(或者使用
javac
java
而不是Eclipse在本地编译和运行它)

理论:来自:

首先,如果方法引用表达式以ExpressionName或Primary开头,则对该子表达式求值如果子表达式的计算结果为
null
,则会引发
NullPointerException
,并且方法引用表达式会突然完成


(我的重点是。)

您正在使用Eclipse进行测试吗?我用JDK1.8.0_51进行了测试,它在预期的地方抛出了NPE。这可能回答了这个问题。因为它应该在
Runnable fn=test::m
@Michael Yes上抛出一个NPE,所以Eclipse中似乎有一个关于这一点的bug(与链接的问题相同)。Eclipse中仍然存在问题。当您的工具像这样误导您时,这是多么痛苦。这是有意义的,因为对于这种类型的方法引用,::的左侧是一个返回引用的表达式。虽然这更明确地说是一个空引用,但效果是一样的:
functionthatturnsnall()::method
这个错误是否报告给Eclipse了?@didierr:我不知道,我不使用Eclipse。作为一种解决方法:Lambda,或者静态方法引用,如果您仍然想使用nullable对象的方法,则不会在求值阶段抛出。[Runnable fn=()->test.m()]或[Consumer c2=test::m]