2013-07-27 29 views
-2
class test 
{ 
    public static myclass x; 

    test() { 
     try { 
      x=new myclass(); 
      //x is not null here 
     } catch(Exception e) {/*stuff*/} 
     //not null here 
    } 

    //x is null here in any other member method 
} 

請解釋此行爲的原因? 構造函數塊結束後,是不是需要保留一個值而不是丟失它的構造函數?構造函數後的空值

+1

這很難說發生了什麼,沒有看到更多的代碼。你能告訴我們如何以及從哪裏訪問'x'? –

+0

我很抱歉通過移動設備進出口。但其他類是一個普通的簡單類拋出異常每種方法 –

+0

我試圖訪問x在所有使用x == null的註釋的地方如果語句 –

回答

4

你似乎是用實例值混淆靜態值。

x是靜態的,但它沒有在靜態初始化塊中初始化。只有當您創建實例test(通過該實例的構造函數)時纔會初始化。還要注意,只要你創建一個test的新實例,它就會重新初始化,這可能會給你造成一些非常奇怪的錯誤。當運行時加載

class test 
{ 
    public static myclass x; 

    static 
    { 
     x=new myclass(); 
    } 
} 

這樣x應該只初始化一次,靜態,:

爲了x被初始化爲該類的靜態值,將其添加到一個靜態初始化塊類。這將允許在不首先創建test的實例的情況下訪問它,並且消除在test的任何新實例上重新初始化它的錯誤。

相反,如果這應該替代地是實例值,而不是一個靜態值,你可以簡單地改變它的聲明:

public myclass x; 
1

這樣的代碼是正確的。但由於變量xstatic,因此您可能在調用構造函數之前訪問它。在那種情況下它將是空的。只要構造函數第一次運行,x的值將被設置爲一個新的對象。

如果您的要求保持x靜態。在靜態初始化塊中初始化它。像:

class test 
{ 
public static myclass x; 
static { 
    x = new myclass(); 
    } 
} 

或簡稱爲:

class test 
{ 
public static myclass x = new myclass(); 
} 
+0

Java不允許非靜態,因爲我在這個類中有一個main。那就是爲什麼我用另一種方法檢查構造函數之後。那裏是空的。然而,我在防衛地點使用了「新」,沒有應用錯誤 –

+0

@XperiazX看到我的編輯。 – Ankit