循环中检测到无法访问的代码

时间:2014-07-26 17:18:28

标签: java eclipse

为什么我在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;

    }

3 个答案:

答案 0 :(得分: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”声明为静态最终变量中的常量,以提高可读性并使修改更容易。

答案 1 :(得分: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

我可以发布额外的例子吗? - 向下选民提问

上面的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

答案 2 :(得分:0)

JVM已经在编译时评估了你的代码,并且知道else部分永远不会被重新安装