2014-08-31 61 views
-3

當我運行這段代碼時,我得到了UNREACHABLE STATEMENT錯誤。但是,如果我將false更改爲true(在第二時間),則輸出爲:「1 0」並繼續執行。 裏面發生了什麼?Java - While循環(幫我理解流程)

int m=2; 
while (m >0) 
{ 
m =m -1; 
System.out.println(m); 
} while (false); 

輸出: 「錯誤:無法訪問的聲明」

但是,如果

int m=2; 
while (m >0) 
{ 
m =m -1; 
System.out.println(m); 
} while (true); 

輸出: 「1 0」

在此先感謝...

+2

你是否認真縮進塊只有一個空格? – MightyPork 2014-08-31 14:38:55

回答

2

讓格式的代碼一點:

正如你看到你有兩個迴路在這裏,首先就while (m > 0)和第二while (false)。讓我們集中在第二循環

while (false) 
    ; 

這裏有

  1. 兩次失誤這個循環將永遠不會重複,因爲它的條件始終應執行永遠不會達到假所以潛在的代碼(這是無法達到的聲明)。
  2. 即使在這種循環條件可以進行評估,以真正,它沒有指令(之前分號是空指令)來執行,從而這個循環是等價的

    while (false){ 
        //nothing 
    } 
    

現在之所以你看到關於無法語句錯誤是因爲根據Java Language Specification 14.21

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


現在,如果你在這個循環改變條件不可達語句在這個循環就會消失的while (true)問題,但有兩個不好的事情會發生

  1. 你最終會產生無限循環,將什麼也不做(除了服用處理器時間)

    while (true){ 
        //will do nothing forever 
    } 
    
  2. ,因爲放置後,這個無限循環的指令將可達所以像

    while (true){ 
        //will do nothing forever 
    } 
    System.out.println("foo");//unreachable 
    

    將導致與以前相同的錯誤。

+0

非常感謝您...我明白了.. – 2014-08-31 15:13:57

+0

@VimalKumar歡迎您:) – Pshemo 2014-08-31 15:20:04

5

兩個你的例子很奇怪,我的問題是...

while (m >0) 
{ 
m =m -1; 
System.out.println(m); 
} while (false); 

...實際上意味着

while (m >0) 
{ 
m =m -1; 
System.out.println(m); 
} 

// another while statement 
while (false) 
    ; // loop's body - empty statement 

因此,永遠不會達到第二while語句體(分號=空語句)。

如果你把true那裏,你已經做了一個無限循環 - 不知道這是你的目標壽。

我相信你把do {...} while(...);語法與while(...) {...}混淆了,並創建了兩者的bizzare混合。

+0

謝謝......但爲什麼會出現這種錯誤?當條件爲假時 – 2014-08-31 14:59:22

+0

正如我所說的,第二個while循環具有空語句作爲一個主體。因爲它的條件是「錯誤的」,所以這條語句永遠不會被執行。因此它無法訪問,你會得到錯誤。現在你能接受答案嗎? – MightyPork 2014-08-31 15:04:14

+0

非常感謝你......我明白了.. – 2014-08-31 15:17:23