3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
問題是編譯器不知道當(dāng)你訪問它時(shí)x 會(huì)被初始化。那是因?yàn)榫幾g器不會(huì)檢查循環(huán)體是否真的會(huì)被執(zhí)行(在極少數(shù)情況下,即使是這樣一個(gè)簡(jiǎn)單的循環(huán)也可能不會(huì)運(yùn)行)。
如果條件不總是正確的,那么你的 if-block 也是如此,即如果你使用這樣的布爾變量:
int x;
boolean cond = true;
if( cond ) {
x = 5;
}
//The compiler will complain here as well, as it is not guaranteed that "x = 5" will run
System.out.println(x);
你作為一個(gè)人會(huì)說(shuō)“但cond被初始化true并且永遠(yuǎn)不會(huì)改變”但編譯器不確定(例如,因?yàn)榭赡艿木€程問題),因此它會(huì)抱怨。如果你創(chuàng)建cond一個(gè) final 變量,那么編譯器會(huì)知道cond在初始化后不允許更改,因此編譯器可以內(nèi)聯(lián)代碼以if(true)再次有效地?fù)碛小?/p>

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
如果您將 if 塊中的條件從trueto更改為,false您將得到與variable 'x' might not have been initialized. 當(dāng)你這樣做時(shí)if(true),編譯器可以理解 if 塊中的代碼將始終運(yùn)行,因此變量 x 將始終被初始化。
但是當(dāng)您在 for 循環(huán)中初始化變量時(shí),可能會(huì)發(fā)生 for 循環(huán)永遠(yuǎn)不會(huì)運(yùn)行并且變量未初始化的情況。
public static void main(String[] args) {
int x; // Declared in main method
if(false)
{
x=5; //compile error
for(int i=0;i<5;i++)
{
//x=5 initialized inside loop
}
}
System.out.println(x);
}
為避免這種情況,將變量初始化為 int x = 0;

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
它仍然可以訪問,但程序可能永遠(yuǎn)不會(huì)訪問 for 塊。由于編譯器不滿足 for 循環(huán)之外的任何其他 var 初始化,它會(huì)給你一個(gè)錯(cuò)誤。為了編譯它,您必須使用默認(rèn)值初始化變量:
class Myclass {
public static void main (String[] args) {
int x = 0; // Declared in main method and init with a default value.
if(true) {
for(int i=0;i<5;i++) {
x=5;// Reinitialized inside loop
}
}
System.out.println(x); // No problems here.
}
}
添加回答
舉報(bào)