2016-02-26 47 views
0

這裏有兩個未初始化的局部變量。仍然這不會給編譯時或運行時錯誤並且完全執行。在Java和How(這個解釋是值得歡迎的)中這個東西是允許的嗎?未初始化的局部變量 - 無錯誤:Java

class A2{ } 

public class A { 
public static void main(String[] args) { 
    int x; 
    A2 a2; 

    System.out.println("Main"); 
} 

} 
+0

我讀過「總是初始化一個局部變量」「一個未初始化的局部變量違反了java規則 – IDontKnow006

回答

0

該代碼沒有任何不正確。你實際上並沒有使用這些變量,所以沒有問題。如果你確實嘗試使用它們,那麼它會成爲一個問題。例如,

System.out.println(a2); 
System.out.println(x); 

會帶來 「變量 'X'/ 'A2' 可能尚未intitialized」 的錯誤。將沒有默認值或運行代碼的能力。這將是編譯時錯誤,您的代碼將無法運行。如果變量是類字段,則它們將獲得某些類型的默認值,否則將會獲得默認值。

+0

如果在這個代碼中x得到一個默認值,那麼我可以打印這個值嗎? – IDontKnow006

+0

在這裏他們會得到什麼值。我沒有使用它們。編寫代碼時,他們是否將某些東西放在堆棧中? – IDontKnow006

+0

爲此編輯。 @ IDontKnow006 – ChiefTwoPencils

0

這兩個變量都沒有在代碼中使用。一旦你嘗試使用它作爲System.out.println(「Main」+ x);它會給你編譯錯誤,因爲局部變量沒有被初始化。

+0

在這他們將獲得什麼價值。我沒有使用它們。編寫代碼時,他們是否將某些東西放在堆棧中? – IDontKnow006

+0

@ IDontKnow006正如你永遠無法觀察那個價值,這個問題是毫無意義的。甚至可能完全刪除變量。 – EJP

+0

@EJP我沒有得到你的聲明 - 甚至有可能........完全刪除。「 – IDontKnow006

0

是的,只要你不訪問它們,就可以在上面的代碼中完成局部變量聲明。如果你碰巧寫了任何訪問這些變量的代碼,代碼將不會編譯。

根據Java語言規範,除非在訪問之前初始化,否則不能訪問本地變量(在方法內部聲明的變量)。下面是Java語言規範的SE 8

https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.4.1

第16章 - 明確賦值

「對於一個局部變量或空白決賽場上的每次訪問,則x必須被明確 分配在訪問之前或發生編譯時錯誤。「

第14章

14.4.2局部變量聲明 局部變量聲明語句的執行是一個可執行語句。每次執行 時,聲明符按從左到右的順序處理。如果聲明者 具有初始值設定項,則初始值設定項會被評估並將其值分配給該變量。 由§16(明確賦值)的 規則如果聲明符不具有初始化,然後到可變每引用必須是 通過賦值給變量,或編譯時錯誤的執行之前進行。 只有在對前面的 初始化程序的評估正常完成時,纔會評估每個初始化程序(除第一個之外)。 只有當最後一個初始化程序的評估 正常完成時,才執行本地變量聲明。 如果局部變量聲明不包含初始值設定項,則始終執行 。