簡體   English   中英

初始化對象時,實例變量是否始終未初始化?

[英]When Initializing object, instance variable not initialized always?

以下代碼生成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 3 line 5移到line 3 line 5 line 3之后,它運行正常。 訂單如何在這里重要? 不應該每次實例化一個類設置iVar值嗎?

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

解決這個問題的一種簡單方法是交換第3行和第4行,因此在創建對象時, have_instance已經有了一個值。 或者您可以將have_instance聲明為boolean而不是Boolean ,因此它將具有值false而不是null 這會使程序打印出來。

或者也許你可以重新考慮你想要做的事情。 在類初始化之前創建類的實例很少是個好主意,特別是如果類不是“最終”(即可能有子類)。

如果通過設置其值或使用靜態初始化程序塊直接初始化這些字段,則字段順序很重要。 它們按順序執行。 所以你不能做一個前向參考:

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

這不起作用,因為字段按其文本聲明的順序初始化。 如果你有兩個靜態初始值設定項,它們也將按順序執行:

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

因此,在您的情況下,您在have_instance之前初始化instance ,因此后者仍為null (非基元的默認值)。 JVM將創建一個要分配給instanceMyClass對象並初始化其字段, have_instance inst_Avail的值分配給inst_Avail ,該值也將設置為null

一些讀物:

這段代碼非常奇怪,我沒有看到用例,但是這樣可以解決這個問題:

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
    }

}

另一個解決方案可能是將inst_Avail設置為靜態,以便在加載類時,實例化此變量:

 private static  Boolean inst_Avail=have_Instance;

您將static變量值分配給non-static變量

Boolean inst_Avail=have_Instance;

要么讓它static要么

constructor指定inst_Avail = true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM