2017-04-22 87 views
-2

獲得NullPointerException異常,C1爲主要方法初始化,將在後面的Class2訪問的情況,但我得到的NullPointerExceptionNullPointerException異常靜態引用變量

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

「稍後訪問」 - 否,在**之前訪問**。使用調試器逐步完成。 –

回答

1

要分配Test.c1的價值,首先需要完全構造一個Class1的實例。

但是,當您構造Class1時,您將Class2構造函數調用到class1()方法中,該方法依次打印一些內容。在這一點上,你還沒有完全構建Class1的情況下,作爲結果,Test.c1尚未初始化

0

這是相當簡單:

  1. Test被加載,c1獲得它的缺省值爲null

  2. mainjava工具調用。

  3. main調用Class1的構造函數。

    1. Class1的構造函數調用class1

      1. class1要求Class2的構造函數。

        1. Class2的構造試圖取消引用Test.c1,這是null,所以它拋出。

它只會是一旦嵌套系列完成了c1將獲得價值。但是由於代碼在它具有(非null)值之前嘗試使用它,它會失敗。

用調試程序遍歷代碼可以使這個東西更加清晰。使用調試器並不是一項高級技能,它對於初學者來說至關重要,可以作爲一種學習工具,用於發生什麼情況。

相關問題