2015-01-08 132 views
2

爲什麼下面會出現錯誤?'for'循環中的錯誤是什麼?

for(; 0 ;)  System.out.println("guess"); // or 
for(;false;)  System.out.println("guess"); // or 
for(; 1 ;)  System.out.println("guess"); 

但以下運行好(無限):

for(;true;)  System.out.println("guess"); 

爲什麼它true工作,但不是爲false

+0

'; true;'總是如此,是一個有效的條件。 「假」永遠不會是真的,所以無效。其餘的都是不言自明的。 –

+0

'; for(;;)''也可以作爲一個無限循環工作 – timbru31

+0

@AliAkber我建議讀一下for循環(http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for的.html)。如下所示: '當終止表達式計算結果爲false時,循環終止' 因此,您的循環將不會執行,因爲它已經終止。 – Ascalonian

回答

8

條件(即位於;之間的位)必須是布爾值,所以這會立即排除第一個片段中的第一個和第三個變體。

現在,第二個變體,在其中您使用一個布爾值,不編譯因爲編譯器實現的循環將永遠不會進入,因此發出了一個錯誤:

 
Untitled.java:3: error: unreachable statement 
     for(;false;)  System.out.println("guess"); 
         ^
1 error 

注意的錯誤無法訪問的語句發出的JLS任務(見§14.21):

It is a compile-time error if a statement cannot be executed because it is unreachable.

...

The contained statement is reachable iff the for statement is reachable and the condition expression is not a constant expression whose value is false .

+1

它不應該是一個警告?如果是的話,調試會容易得多。 – Maroun

+2

@MarounMaroun這是有爭議的。如果我設計編譯器,我可能會提出警告,但我確信有一個情況可以使它成爲一個錯誤。 – arshajii

+0

是'; false;'Java中的錯誤?剛剛在C#中測試過,它編譯得很好,但它確實提供了一個內部代碼無法訪問的警告(這很明顯)。 –

1

的Java需要一個boolean作爲第二p在你的循環頭文件中,它計算語句,如果語句返回true,那麼jvm將運行循環體的代碼,而不會跳過正文。

0和1顯然沒有布爾值,也沒有定義可以評估的語句(如x < y),並且由於java是一種靜態且強類型的語言(與Python或Perl不同),因此無法將int類型轉換爲布爾值,所以它崩潰。

編輯:如果您提供「false」作爲語句,JVM將注意到永遠無法到達循環體,這將導致運行時錯誤。

0

不同於C,在Java中,truefalse對應boolean類型值,其中1和0至int(事實上,在C沒有boolean聲明類型,和布爾檢查基於整數比較完成的。在Java ,事情是不同的)。