繁体   English   中英

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

[英]unreachable code detected in loop

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

    }

看来您打算写:

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" b.Text = turn ? "X" : "O"代替if/else块。 您还可以在静态最终变量中将“ X”和“ O”声明为常量,以提高可读性并简化修改。

else部分将永远不会到达,因为编译器已经知道第一个条件if(true)将始终被执行。

在Java中,任何无法访问的代码都会导致编译错误。

JLS§14.21下有更好的解释 无法到达的陈述

如果由于语句无法访问而无法执行该语句,则是编译时错误。

在这种情况下,编译器非常聪明,如果将其转换为以下代码,则它将永远不会出现此错误

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM