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.
Sono a conoscenza di [questo] (http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe) . –
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 –
@RefLibApi Quindi sai che non è possibile lanciare un NPE ma stai chiedendo come lanciare un NPE ... Non sono sicuro di seguirti. – assylias