2016-06-07 53 views
9

有没有可能在Java中引用 null引用的方法引用?这样做可能是永远正确的,但可能导致其很难后来发现错误:在空引用上创建方法引用不会引发异常

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/[email protected] 
     fn.run(); // throws a null pointer exception 
    } 
} 
+5

你与Eclipse测试?我使用JDK 1.8.0_51进行了测试,并在预期的情况下抛出了NPE。这可能会回答这个问题,然后http://stackoverflow.com/questions/37413106/thread-setuncaughtexceptionhandler-and-java-8-method-reference/。因为它应该在'Runnable fn = test :: m'上抛出一个NPE。 – Tunaki

+0

我投票结束这个问题作为题外话题,因为它询问的是不存在的行为。 –

+0

@Tunaki是的,我在Eclipse中测试过,当我取消注释最后一行时,它不会抛出异常 – Michael

回答

11

是否有一个原因,它可以创建在Java中null参考方法参考?

它不是,但显然有在Eclipse在这方面(编辑:这已经been fixed)的错误。根据规范,当您使用JDK的工具时,它会在Runnable fn = test::m;产品线上的NPE上失败。

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

理论:从JLS §15.13.3

首先,如果该方法的参考表达开始于ExpressionName主要,这个子表达式被评估。 如果该子表达式评估为null,则NullPointerException被提出,并且方法引用表达式突然完成。

(我的重点。)

+0

是否向Eclipse报告此错误? –

+1

@DidierL:我不知道,我不使用Eclipse。 –

+1

此问题已在https://bugs.eclipse.org/bugs/show_bug.cgi?id=521182中解决 – bjmi