2014-07-26 35 views
0

爲什麼我在else循環中'b'上檢測到無法訪問的代碼?在循環中檢測到無法訪問的代碼

private void a1_Click(object sender, EventArgs e) 
    { 
     Button b = (Button)sender; 

     if (true) 
     { 
      b.Text = "X"; 
     } 
     else 
     { 
      b.Text = "O"; 
     } 
     turn = !turn; 

    } 
+0

因爲你'if'條件始終評估爲'真'。 –

回答

1

else部分永遠不會達到的,因爲編譯器已經知道第一個條件if(true)就一定會執行。

在java中,任何不可達的代碼都會導致編譯錯誤。

這是更好JLS§14.21. Unreachable Statements

解釋下這是一個編譯時錯誤,如果不能執行的語句,因爲它是不可達。

編譯器是在這種情況下,很聰明,如果你把它轉換成下面的代碼,然後它永遠不會給你這個錯誤

boolean flag = true 
if(flag){ 
    b.Text = "X"; 
}else{ 
    b.Text = "O"; 
} 

現在試試這個:

int x=5; 
if (false) { x=3; } // same Dead code 

我可以張貼額外的例子嗎? - 向Down-voter詢問

上面的JLS部分有更多解釋。

下面是一個例子:

while(true){ 
    System.out.println("hello"); 
} 
System.out.println("bye"); // this line is in problem 

現在使用相同的標誌,但使其final

final boolean flag = true; 
while(flag){ 
    System.out.println("hello"); 
} 
System.out.println("bye"); // still this line is in problem 
// because compiler knows that final variable never be changed once assigned 
+0

那麼我應該在這裏使用什麼? – user3880201

+0

聲明一個布爾變量並將其賦值爲true。這應該可以解決你的問題。這樣編譯器不會在編譯時評估if語句,而是在運行時會這樣做 – mkazma

6

它看起來像你的意思是寫:

private void a1_Click(object sender, EventArgs e) 
{ 
    Button b = (Button)sender; 

    if (turn) 
    { 
     b.Text = "X"; 
    } 
    else 
    { 
     b.Text = "O"; 
    } 
    turn = !turn; 

} 

正如有人說,將始終評估if(true)塊,並使else塊不可用。 (只要你遵循的慣例允許你使用[運算符的用法應該是一致的])。在這裏,我將使用三元運算符(只要你遵循的約定允許你)。

你會得到b.Text = turn ? "X" : "O"而不是if/else塊。您還可以在靜態最終變量中聲明「X」和「O」作爲常量,以提高可讀性並使修改更容易。

+0

什麼是turn?我沒有看到它的定義。 – Brian

+2

在他的例子中,爲什麼這是低調的? –

+0

它在底部,但它不是函數的一部分。我們甚至不知道它的作用。 – Brian

0

的JVM已經評價你的代碼在編譯的時候,知道else部分將永遠不會被rearched