2013-07-07 79 views
3

下面的代碼會產生NullPointerException異常 -初始化對象時,實例變量始終未初始化?

public class MyClass { 

    static MyClass instance= new MyClass(); // line 3 
    static Boolean have_Instance = true; 
    Boolean inst_Avail=have_Instance; // line 5 

    Boolean isInstAvail(){ 
     return inst_Avail; 
    } 

    public static void main(String[] args) { 
     System.out.println(instance.isInstAvail() ? "Instance is there.":""); // gives java.lang.NullPointerException 
    } 

} 

如果我提出line 3line 5後,運行良好。訂單如何在這裏重要?每次都不應該實例化類設置iVar值?

+0

Uuuh ...你想要做什麼? – fge

回答

3

當在第3行上創建對象時,該類尚未完成初始化,並且have_instance變量的默認值爲null。該值被分配給對象的inst_Avail成員變量,因此通過instance.isInstAvail()main方法返回的值將是null

一種簡單的方法來解決這個被交換線3和4,所以have_instance已經具有當在創建對象的值。或者,你可以聲明have_instance作爲boolean代替Boolean,所以它的值將爲false,而不是null。這會使程序不打印任何東西。

或者,也許你會重新考慮你想要做什麼。這是很少上課之前完成初始化創建類的實例是一個好主意,尤其是如果該類不是「最終」(即可能有子類)。

+0

當你交換第3行和第4行時,'have_instance'變量將在實例創建之前被設置,所以是的,這樣做會讓程序打印出'Instance is there.'爲什麼會有無限循環的新實例? – Joni

0

這另一種解決辦法是讓inst_Avail爲靜態的,因此,在加載類的時候,這個變量被實例化:

private static Boolean inst_Avail=have_Instance; 
0

要分配static變量值non-static變量

Boolean inst_Avail=have_Instance; 

要麼使其static

分配inst_Avail = trueconstructor

2

字段的順序問題,如果你初始化設置它們的值,或使用一個靜態初始化塊,這些領域直接。它們按順序執行。所以你不能做一個正向引用:

private int someInt = 10 + otherInt; 
private int otherInt = 22; 

這將無法正常工作,因爲這些字段按其文本聲明的順序進行初始化。如果你有兩個靜態初始化,他們將在順序執行,以及:

static { System.out.println("first"); } 
static { System.out.println("second"); } 

所以你的情況,你have_instance前初始化instance,所以後者仍然null(非原語默認值)。 JVM將創建被分配給一個instance對象MyClass並初始化其欄位,即分配的have_instanceinst_Avail,它的值將被設置爲null爲好。

一些讀數:

0

這段代碼是很奇怪,我不看使用情況這一點,但這會做修正:

public class MyClass { 

    static MyClass instance; // line 3 
    static Boolean have_Instance = true; 
    Boolean inst_Avail=have_Instance; // line 5 

    Boolean isInstAvail(){ 
     return inst_Avail; 
    } 

    public static void main(String[] args) { 
     instance = new MyClass(); 
     System.out.println(instance.isInstAvail() ? "Instance is there.":""); // gives  java.lang.NullPointerException 
    } 

}