2012-11-24 18 views
9

Eventuali duplicati:
How come invoking a (static) method on a null reference doesn’t throw NullPointerException?
Static fields on a null reference in Javametodo della forza chiamata variabile nulla per gettare un NullPointerException

ho provato il codice this old video:

class Impossible { 
    public static void main(String[] args) { 
     Thread t = null; 
     System.out.println(t.currentThread().getName()); 
    } 
} 

uscita: main

Beh, che diavolo è ?! java.lang.Thread viola la regola NullPointerException?

Ma quello che mi interessa di più: Come posso fare in modo che la variabile si comporti per lanciare una NullPointerException?

+3

Sono a conoscenza di [questo] (http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe) . –

+2

Se si desidera il modo più rapido per garantire che venga lanciato un NPE, basta chiamare il metodo '.getClass();'. Aveva il vantaggio di non aumentare il conteggio delle ramificazioni nella copertura del codice –

+0

@RefLibApi Quindi sai che non è possibile lanciare un NPE ma stai chiedendo come lanciare un NPE ... Non sono sicuro di seguirti. – assylias

risposta

10

java.lang.Thread viola qualsiasi regola NullPointerException?

No, motivo per una NPE stata gettata non è correlato a un class. È correlato a un instance di quella classe, su cui è stata eseguita l'invocazione. Inoltre, dipende da quale tipo di metodo o campo si sta accedendo.

Quello che sta accadendo qui è, currentThread() è un metodo statico di classe Thread. Che è boudn per una classe, piuttosto che un'istanza. Quindi, anche se lo invocate su un riferimento della classe Thread, in realtà viene invocato sul nome della classe.

Quindi,

Thread t = null 
t.currentThread(); 

è in realtà invocato come: -

Thread.currentThread(); 

Così, quando si accede a un membro statico attraverso l'espressione oggetto di riferimento, solo il tipo dichiarato di materie di riferimento. Questo significa che:

  • Non importa se il riferimento è effettivamente indicando nullo, in quanto non è necessaria alcuna esempio.

  • Se il riferimento non è nullo, non importa quale tipo dell'oggetto la riferimento sta puntando, non c'è distribuzione dinamica.


Come posso fare che si comportano variabile per gettare un NullPointerException?

Bene, l'attuale stampa non getterà mai uno NPE. La prima parte è già stata spiegata sopra. Ora, andiamo avanti.

Thread.currentThread(); 

L'invocazione sopra riportata non restituirà mai null. Restituisce sempre l'istanza del thread corrente. E in Java, sei sempre dentro l'uno o l'altro thread. Anche quando si utilizza il metodo public static void main, si sta eseguendo lo Main Thread. Quindi, currentThread non può essere null.

E, di conseguenza, ulteriori invocazione: -

Thread.currentThread().getName(); 

funzionerà benissimo, e restituire il nome del thread corrente.

+0

Ok, la seconda parte è stata chiara per me, grazie. = ( –

+0

@RefLibApi .. Ho pensato che fosse la cosa che potrebbe confondervi. Prego :) –

3

currentThread() è un metodo static della classe Thread. Ciò significa che non è associato ad alcuna particolare istanza della classe, ma alla classe stessa.

Con questo in mente, t.currentThread() è semplicemente un modo diverso di dire Thread.currentThread(). Il valore di t non viene utilizzato affatto, quindi non importa se t è null.

0

Se si vede che il codice all'interno del vostro ENV di sviluppo (Eclipse/Netbeans) si sarebbe visto a il primo momento in cui currentThread() è scritto in corsivo, che indica chiaramente che si tratta di un metodo statico (metodo Class).

Inoltre, se hai lo stile di controllo abilitato, ti avviserà di non chiamare metodi statici su istanze di un oggetto.

La domanda è un po 'errata, poiché la formattazione del codice qui non può visualizzare metodi statici diversamente formattati.

E per rispondere definitivamente alla domanda: Il Thread di classe non è mai nullo, le istanze di una classe possono essere nulle.