我在學習java,我知道java變量的作用域,比如類級、方法級、塊級。但是,當我嘗試實踐變量范圍時,我在代碼中遇到了錯誤。我的代碼如下:
public class HelloWorld {
public static void main(String[] args) {
int c;
for (int i=0; i <5; i++) {
System.out.println(i);
c = 100;
}
System.out.println(c);
}
}
當我運行此代碼時,它會顯示錯誤:the c variable might not have been initialized
,但當我將代碼更改為以下內容時:
public class HelloWorld {
public static void main(String[] args) {
int c=0;
for (int i=0; i <5; i++) {
System.out.println(i);
c = 100;
}
System.out.println(c);
}
}
代碼將打印100
。
我應該如何理解代碼中的作用域?
在Java中,局部變量不是用默認值初始化的(不像,例如類的字段)。從語言規范(§4.12.5)可以看出:
因為它是在Java語言規范上顯式設置的,所以編譯器不會(也不應該)推斷變量
c
將始終在循環內更新:編譯器嚴格執行該標準,并通知您違反其中一條規則時出現錯誤:
因此,即使您的代碼可以被正式證明是有效的,編譯器也不需要嘗試分析應用程序的邏輯,局部變量初始化規則也不依賴于此。編譯器檢查變量
c
是否根據局部變量初始化規則初始化,并相應地檢查reacts(例如,顯示int c;
情況下的編譯錯誤)。