2017-04-22 3 views
-2

Nullpointer Erste, c1 in main-Methode initialisiert wird und später in Klasse 2 zugegriffen wird, aber ich bin immer NullpointerNullpointer bei statischer Referenzgröße

public class Test 
{ 
    static Class1 c1; 
    public static void main(String[] args) 
    { 
     c1 = new Class1(); //c1 is initialized, still null pointer exception 
    } 
} 

public class Class1 
{ 
    int a,b; 
    Class1() 
    { 
     class1(); 
    } 
    void class1() 
    { 
     a = 5; 
     b = 10; 
     Class2 class2 = new Class2(); 
    } 
} 

public class Class2 
{ 
    Class2() 
    { 
     Class1 c = Test.c1;   //c1 is null here 
     System.out.println(c.a); //NullPointerException for Test.c1 
     System.out.println(c.b); 
    } 
} 
+1

"Später zugegriffen" - nein, ** vorher **. Durchlaufen Sie einen Debugger. –

Antwort

1

Um den Wert Test.c1, müssen Sie zuerst zuweisen zu konstruieren komplett eine Instanz von Class1.

Wenn Sie jedoch Class1 konstruieren, rufen Sie den Class2-Konstruktor in der class1() -Methode auf, die wiederum einiges Zeug druckt. An dieser Stelle haben Sie noch nicht vollständig die Class1 Instanz konstruieren, als Folge wird Test.c1 noch nicht

initialisiert
0

Es ist ziemlich einfach:

  1. Wenn Test geladen wird, c1 bekommt seinen Standard Wert null.

  2. main wird von der java Werkzeug aufgerufen.

  3. main ruft Class1 's Konstruktor.

    1. Class1 ‚s Konstruktor ruft class1.

      1. class1 Anrufe Class2 ‚s-Konstruktor.

        1. Class2 ‚s Konstruktor versucht zu dereferenzieren Test.c1, die null ist, so wirft es.

Es wäre nur ein einziges Mal sein, dass verschachtelte Serie abgeschlossen, dass c1 Wert erhalten würde. Aber da der Code versucht, es zu verwenden, bevor es einen (nicht null) Wert hat, schlägt es fehl.

Durch das Durchlaufen des Codes mit einem Debugger kann dieses Zeug dramatisch klarer werden. Die Verwendung eines Debuggers ist keine fortgeschrittene Fähigkeit, sie ist entscheidend für Anfänger, als Lernwerkzeug für das, was wann passiert.