2016-06-07 56 views
9

C'è un motivo per cui è possibile creare metodo riferimenti su un riferimento null in Java? Fare questo è probabilmente mai corretto, ma può causare errori che sono difficili da trovare in seguito:Creazione di un riferimento metodo su un null di riferimento non un'eccezione

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

Stai mettendo alla prova con Eclipse? Ho provato con JDK 1.8.0_51 e lancia l'NPE dove previsto. Questo risponde probabilmente la domanda allora http://stackoverflow.com/questions/37413106/thread-setuncaughtexceptionhandler-and-java-8-method-reference/. Perché dovrebbe lanciare un NPE a 'Runnable fn = test :: m'. – Tunaki

+0

Sto votando per chiudere questa domanda come off-topic perché sta chiedendo un comportamento che non esiste. –

+0

@Tunaki sì testato in Eclipse e non un'eccezione quando ho Decommentare l'ultima linea – Michael

risposta

11

C'è un motivo per cui è possibile creare metodo riferimenti su un riferimento null in Java?

Non è, ma a quanto pare c'è un bug in Eclipse in questo senso (edit: che da allora been fixed). In base alle specifiche e quando si utilizzano gli strumenti di JDK, non riesce con un NPE sulla riga Runnable fn = test::m;.

Prova: http://ideone.com/APWXna (o compilare ed eseguirlo localmente con javac e java anziché Eclipse)

Theory: Da JLS §15.13.3:

Innanzitutto, se l'espressione metodo di riferimento inizia con un ExpressionName o un primaria, questa sottoespressione viene valutata. Se sottoespressione rende null, un NullPointerException viene sollevato, e l'espressione metodo di riferimento completa bruscamente.

(corsivo è mio.)

+0

Era questo bug segnalati per Eclipse? –

+1

@DidierL: non ne ho idea, non uso Eclipse. –

+1

Questo problema è stato affrontato in https://bugs.eclipse.org/bugs/show_bug.cgi?id=521182 – bjmi