[英]Explanation of how classloader loads static variables
好的,這是一個關於java的新手問題,但我似乎無法理解它。
我班上有以下代碼
private static final String [] LIST_CODE = gerarListCode();
private static final int [][] LIST_INTEGER = new int [][] {
{947,947}, {110,103},
{947,958}, {110,120},
{947,954}, {103,107},
{947,967}, {110,99,104}};
private static String [] gerarListCode()
{
String [] listCode = new String [LIST_INTEGER.length];
for (int i=0 ; i<LIST_INTEGER.length ; i++)
{
//do some stuff
}
return listaUnicode;
}
由於以下行中的nullpointerexception,此代碼給出了初始化異常
String [] listCode = new String [LIST_INTEGER.length];
似乎那時變量LIST_INTEGER為null。
有人可以解釋原因嗎? 是類加載器進程是線性的,換句話說,它是在完全加載所有其他變量之前調用方法嗎?
是的,簡而言之,它是線性的。
“編譯器實際上做的是在內部生成一個單獨的類初始化例程,該例程將所有靜態變量初始化器和所有靜態初始化器代碼塊按它們在類聲明中出現的順序組合在一起。這個單獨的初始化過程自動運行,只有一次,當班級第一次裝載時。“
簡而言之,取自Java。
http://www.developer.com/java/other/article.php/2238491
您應該定義變量,然后以正確的順序在靜態intitializer塊中初始化它們,或者您可以按如下方式交換語句的順序:
private static final int [][] LIST_INTEGER = new int [][] { {947,947}, {110,103},
{947,958}, {110,120},
{947,954}, {103,107},
{947,967}, {110,99,104}};
private static final String [] LIST_CODE = gerarListCode();
實際上,JVM將按照遇到它們的順序初始化靜態字段。
當JVM首次遇到類時,將初始化類的靜態字段。 根據Java Puzzlers ,謎題49(繼續引用JLS 4.12.5),靜態字段首先被設置為它們的默認值。 對象變量設置為null
, int
s設置為0等。之后,它們的初始化程序按外觀順序執行。
因此,在您的示例中, LIST_CODE
和LIST_INTEGER
首先設置為null
。 然后, LIST_CODE
通過調用初始化gerarListCode()
執行該方法時, LIST_INTEGER
仍為null
。 只有在那之后, LIST_INTEGER
才會使用您在示例中給出的文字值進行初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.