這裏有兩個未初始化的局部變量。仍然這不會給編譯時或運行時錯誤並且完全執行。在Java和How(這個解釋是值得歡迎的)中這個東西是允許的嗎?未初始化的局部變量 - 無錯誤:Java
class A2{ }
public class A {
public static void main(String[] args) {
int x;
A2 a2;
System.out.println("Main");
}
}
這裏有兩個未初始化的局部變量。仍然這不會給編譯時或運行時錯誤並且完全執行。在Java和How(這個解釋是值得歡迎的)中這個東西是允許的嗎?未初始化的局部變量 - 無錯誤:Java
class A2{ }
public class A {
public static void main(String[] args) {
int x;
A2 a2;
System.out.println("Main");
}
}
該代碼沒有任何不正確。你實際上並沒有使用這些變量,所以沒有問題。如果你確實嘗試使用它們,那麼它會成爲一個問題。例如,
System.out.println(a2);
System.out.println(x);
會帶來 「變量 'X'/ 'A2' 可能尚未intitialized」 的錯誤。將沒有默認值或運行代碼的能力。這將是編譯時錯誤,您的代碼將無法運行。如果變量是類字段,則它們將獲得某些類型的默認值,否則將會獲得默認值。
如果在這個代碼中x得到一個默認值,那麼我可以打印這個值嗎? – IDontKnow006
在這裏他們會得到什麼值。我沒有使用它們。編寫代碼時,他們是否將某些東西放在堆棧中? – IDontKnow006
爲此編輯。 @ IDontKnow006 – ChiefTwoPencils
這兩個變量都沒有在代碼中使用。一旦你嘗試使用它作爲System.out.println(「Main」+ x);它會給你編譯錯誤,因爲局部變量沒有被初始化。
在這他們將獲得什麼價值。我沒有使用它們。編寫代碼時,他們是否將某些東西放在堆棧中? – IDontKnow006
@ IDontKnow006正如你永遠無法觀察那個價值,這個問題是毫無意義的。甚至可能完全刪除變量。 – EJP
@EJP我沒有得到你的聲明 - 甚至有可能........完全刪除。「 – IDontKnow006
是的,只要你不訪問它們,就可以在上面的代碼中完成局部變量聲明。如果你碰巧寫了任何訪問這些變量的代碼,代碼將不會編譯。
根據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(明確賦值)的 規則如果聲明符不具有初始化,然後到可變每引用必須是 通過賦值給變量,或編譯時錯誤的執行之前進行。 只有在對前面的 初始化程序的評估正常完成時,纔會評估每個初始化程序(除第一個之外)。 只有當最後一個初始化程序的評估 正常完成時,才執行本地變量聲明。 如果局部變量聲明不包含初始值設定項,則始終執行 。
我讀過「總是初始化一個局部變量」「一個未初始化的局部變量違反了java規則 – IDontKnow006