2014-11-26 13 views
10

mi sono imbattuto seguente codice:NullPointerException o stamperà il contenuto della variabile statica

public class TradingSystem { 

    private static String category = "electronic trading system"; 

    public static void main(String[] args) { 
     TradingSystem system = null; 
     System.out.println(system.category); 
} 

Output: sistema di commercio elettronico

sono rimasto sorpreso di non trovare un NullPointerException!

Q1. Perché non ha lanciato il NullPointerException?

Q2. O mentre è in fase di compilazione, a causa della dichiarazione della categoria con static è stato fatto per sostituire il sistema (i.e riferimento dell'oggetto) con TradingSystem e come tale è stato chiamato essenzialmente TradingSystem.category?

+0

Anche un duplicato di http://stackoverflow.com/questions/3293353/how-come-come-invoking-a-static-method-on-un-null-reference-doesnt-throw-nullpointe – Raedwald

+0

@Raedwald tecnicamente, questo è non esattamente duplicato a questo. ma buono a sapersi, – KNU

risposta

7

Java consente di accedere alle variabili di classe (ad esempio static) utilizzando la sintassi dell'istanza. In altre parole, il compilatore consente di scrivere system.category, ma lo risolve a TradingSystem.category, che è indipendente dall'istanza a cui si accede.

Ecco perché non si ottiene NullPointerException. Tuttavia, questa sintassi non è leggibile e confusa. Questo è il motivo per cui dovresti ricevere un avviso e un suggerimento per utilizzare TradingSystem.category anziché system.category.

+0

quindi la mia seconda proposizione nella seconda domanda era corretta. – KNU

3

Il codice non è diverso dal seguente codice concettualmente.

public class TradingSystem { 

    private static String category = "electronic trading system"; 

    public static void main(String[] args) { 
     System.out.println(TradingSystem.category); 

    } 
} 

Anche se sembra che si stia utilizzando il riferimento a un oggetto di sistema, si sta effettivamente utilizzando il valore statico. Java consente di utilizzare le istanze quando si utilizza la statica, ma si consiglia di preferire la sintassi sopra, in modo che sia chiaro che si stanno utilizzando quelli statici.

1

Non si dovrebbero mai chiamare metodi statici usando istanze di classe, né sono mai necessari. Poiché i metodi statici vengono eseguiti a livello di classe, l'istanza non viene utilizzata e quindi non viene generata alcuna eccezione di puntatore nullo.

+0

Penso che "non dovrebbe mai chiamare ..." è troppo duro. Perché? Se è così, JAVA non avrebbe mai permesso sintatticamente di consentire ciò, ma lo fa. perché? perché tutto ciò che appartiene a una Classe appartiene naturalmente alle sue istanze e come dovrebbe essere chiamato è soggetto al contesto. almeno in senso letterale. – KNU

+0

@KNU Non sono d'accordo. Non so perché Java permette questo modo di chiamare metodi statici (la mia ipotesi è di compilare correttamente codice che altrimenti non potrebbe) ma porta solo a un comportamento inaspettato. Puoi dare un esempio dove questo è utile? –

+0

@Konard Non sto dicendo che potrebbe essere utile ma potrebbe essere più significativo/pratico da usare come riferimento. per esempio. I client non hanno bisogno di sapere se il metodo è statico/non statico mentre li si utilizza in quanto i membri statici possono essere chiamati sia dal contesto statico che non statico. – KNU

1

statico è detto "DI CLASSE" non per oggetto di una classe. Quindi qui

System.out.println (system.category); "il sistema funziona come sistema commerciale"

che è giusto. Poiché non è necessario disporre di un oggetto istanziato per richiamare il campo o il metodo contrassegnato in modo statico.

Problemi correlati