2014-11-26 7 views
10

Ich kam in folgendem Code drucken:Nullpointer oder wird die statische Variable Inhalt

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: elektronisches Handelssystem

Ich war überrascht, keine Nullpointer zu finden!

Q1. Warum hat es nicht die NullPointerException geworfen?

Q2. Oder während der Kompilierzeit aufgrund der Deklaration der Kategorie static es gemacht, um das System (d. H. Objektreferenz) durch TradingSystem zu ersetzen und als solcher im Wesentlichen TradingSystem.category genannt wurde?

+0

Auch ein Duplikat von http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe – Raedwald

+0

@Raedwald technisch, das ist nicht genau das duplizieren. aber gut zu wissen – KNU

Antwort

7

Java ermöglicht den Zugriff auf Klassenvariablen (d. H. static Einsen) unter Verwendung der Instanzsyntax. Mit anderen Worten, der Compiler lässt Sie system.category schreiben, aber es löst es in TradingSystem.category, die unabhängig von der Instanz ist, auf die es zugegriffen wird.

Deshalb erhalten Sie nicht NullPointerException. Diese Syntax ist jedoch nicht lesbar und verwirrend. Deshalb sollten Sie eine Warnung und einen Vorschlag erhalten, TradingSystem.category statt system.category zu verwenden.

+0

so war mein zweiter Vorschlag in der zweiten Frage richtig. – KNU

3

Ihr Code unterscheidet sich nicht konzeptionell vom folgenden Code.

public class TradingSystem { 

    private static String category = "electronic trading system"; 

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

    } 
} 

Obwohl Sie scheinen, System Objektreferenz zu verwenden, verwenden Sie tatsächlich statischen Wert. Java erlaubt die Verwendung von Instanzen, wenn Sie static verwenden, aber Sie sollten die obige Syntax bevorzugen, damit klar ist, dass Sie statische verwenden.

1

Sie sollten niemals statische Methoden mit Klasseninstanzen aufrufen, noch wird es jemals benötigt. Da statische Methoden auf Klassenebene ausgeführt werden, wird die Instanz nicht verwendet und daher wird keine Nullzeigerausnahme ausgelöst.

+0

Ich denke "sollte nie anrufen ..." ist zu hart. Warum? Wenn dem so wäre, hätte JAVA syntaktisch niemals erlauben dürfen, aber das tut es. Warum? denn alles, was zu einer Klasse gehört, gehört natürlich zu ihren Instanzen und wie es heißen soll, hängt vom Kontext ab. zumindest im buchstäblichen Sinne. – KNU

+0

@KNU stimme ich nicht zu. Ich weiß nicht, warum Java diese Art des Aufrufens von statischen Methoden erlaubt (ich rate, Code zu kompilieren, der es sonst nicht könnte), aber es führt nur zu unerwartetem Verhalten. Können Sie ein Beispiel geben, wo dies nützlich ist? –

+0

@Konard Ich sage nicht, dass es nützlich sein könnte, aber es könnte sinnvoller/praktischer sein, Referenz zu verwenden. z.B. Clients müssen nicht wissen, ob die Methode statisch/nicht-statisch ist, während sie als statische Elemente verwendet werden, die sowohl vom statischen als auch vom nicht-statischen Kontext aufgerufen werden können. – KNU

1

statische wird gesagt, "OF CLASS" nicht für eine Klasse zu sein. Also hier

System.out.println (system.category); "System agiert als TradingSystem"

was richtig ist. Da Sie kein instanziiertes Objekt benötigen, um ein statisch markiertes Feld oder eine Methode hervorzurufen.

Verwandte Themen