循环布尔评估

4 java

例1:

public class ExampleWhile {

    public static void main(String args[]) {
        int a = 10, b = 20;
        while (a < b) 
        {
            System.out.println("hello");
        }
        System.out.println("hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

例2:

public class ExampleWhile2 {

        public static void main(String args[]) {
            while (true) 
            {
                System.out.println("hello");
            }
            System.out.println("hi"); // Compile time error saying unreachable statement
        }
    }
Run Code Online (Sandbox Code Playgroud)

为什么示例1在没有错误的情况下运行时,示例2中存在编译时错误?

Men*_*ena 10

因为编译器"聪明"足以知道这while(true)是一个无限循环,因此System.out.println("hi");永远不会被执行.

即使在确定方法范围时,用变量推断相同也不够聪明.

使用编译时常量(static final int使整数成为编译时常量.编译时常量作为字节代码本身的一部分提供),这是另一个故事:

static final int A = 0;
static final int B = 1;
public static void main(String[] args) {
    while (B > A) {

    }
    // won't compile!
    System.out.println("Foo");
}
Run Code Online (Sandbox Code Playgroud)

  • 严格来说,它不是编译器的聪明之处.相反,编译器正在实现Java语言规范中规定的用于确定代码可达性的规则.一个案例是法律代码,另一个案例不是......根据JLS. (2认同)