2017-07-15 92 views
-1

我的代碼時:A.java編譯顯示錯誤的錯誤消息編譯未初始化的最後靜態變量

package pack1; 

public class A { 

    final static int x; 
} 

命令用來編譯代碼:

javac -d . A.java 

編譯時錯誤:

A.java:5: error: variable x not initialized **in the default constructor** 

    final static int x; 
        ^
1 error 

現在,這裏編譯器應該會拋出錯誤,例如=>

error: variable x not initialized **in the static block** 

因爲這裏在這種情況下可能的地方,你可以初始化,聲明的最後靜態初始化的變量只是在聲明本身或 2)靜態塊內的時間=> 1)

有圖片中沒有構造函數...仍然編譯器拋出誤導性的錯誤。

我使用JDK 1.8

java -version 
java version "1.8.0_131" 
Java(TM) SE Runtime Environment (build 1.8.0_131-b11) 
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) 
+2

靜態最終不能在構造函數中初始化,因爲它會嘗試每一個對象創建時間,該時間誤差分配值。相反,你是否試圖在錯誤試圖說的默認構造函數中使用變量x? – OTM

+1

歡迎來到Stack Overflow!我們是一個問答網站,而不是bug庫。請編輯您的問題以清楚說明您需要哪些幫助。 –

+1

https://bugs.openjdk.java.net/browse/JDK-8184444 – Holger

回答

-1

在聲明中的Java類沒有明確聲明構造器,Java的創建了一個無形的默認的無參數的構造,看起來像這樣:

public A() {} 

由於變量xfinal,因此需要在聲明它時或在構造函數中給出它的值。

正如OTM指出的那樣,靜態final變量應該在其聲明中初始化,而不是在構造函數中初始化,因爲構造函數可以被調用任意次數(包括零)。

我同意這個錯誤會誤導那些不瞭解默認構造函數的人,但它確實會產生一定的意義。

+0

爲什麼downvote?如果我的回答不正確,請分享原因,以便我(和其他讀者)可以學習。 –

+1

變量x既是final也是static,所以任何類型的構造函數在這種情況下都不會有幫助。 所以這裏我們只有兩個選擇=> 1)爲x @ time聲明本身賦值,或者使用「static」塊進行初始化... 在這兩個地方,如果你不分配/初始化變量x然後編譯器必須告訴正確的錯誤信息.. like => 錯誤:變量x在聲明時或在靜態塊中未初始化。 而不是這個編譯器是誤導與錯誤=> 錯誤:變量x未初始化在默認的構造函數 因此,我認爲它的錯誤... :) –