Java 编译时无法访问的代码错误

Java compile time unreachable code error

我在程序的下一行遇到编译时间 "unreachable code" 错误:

System.out.println("i =" + i + ", j = " + j);

public static void main(String[] args) {
    int i = 0, j = 5;
    tp: for (;;) 
    {
        i++;
        for (;;) 
        {
            if (i > --j) {
                break tp;
            }

        }
        System.out.println("i =" + i + ", j = " + j);
    }
}

请帮我找出造成这种情况的确切原因。提前致谢。

永远无法到达 System.out.println 代码,即使 i 大于 j。唯一的 break 将您 breaking 送出外部 for 循环。 System.out.println 语句在内部 for 循环之后,但是在内部 for 循环中,您要么继续循环,递减 j,要么 break 外部loop。无法到达 println 语句。

要打印循环结束后 ij 的内容,请将 System.out.println 调用移动到外部 for 循环的结束大括号之后。

我们来分析这段代码:

tp: for (;;)  //<-- similar to while(true)
    {
        i++; //increases i by 1
        for (;;)  //<-- similar to while(true)
        {
            if (i > --j) { //decreases j and compares its value against i
                break tp; //breaks tp, which means breaking the outer for loop
            }
        }
        //while(true) above
        //if break gets executed, it breaks this for loop
        //so this line can never be executed
        System.out.println("i =" + i + ", j = " + j);
    }

最简单的解决方案:

System.out.println("i =" + i + ", j = " + j); 移到外部 for 循环之外。

tp: for (;;)
{
    i++;
    for (;;)
    {
        if (i > --j) {
            break tp;
        }
    }
}
System.out.println("i =" + i + ", j = " + j);

内部循环是无限循环。退出它的唯一方法是当 i > --j 为真时,但这将打破 outer 循环(由于 break tp; 的调用)并且程序将立即在 outer 循环之后执行下一段代码。这意味着没有条件 inner 循环终止 "normally" 所以它之后的下一个代码可以 运行.