while循环布尔评估

时间:2015-05-13 13:55:03

标签: 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");
    }
}

示例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
        }
    }

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

3 个答案:

答案 0 :(得分:10)

因为编译器是&#34;聪明&#34;足以知道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"); }

使用变量推断变量是不够聪明的,即使在确定方法范围时也是如此。

使用编译时常量({{1}}使整数成为编译时常量编译时常量将< em>作为字节码本身的一部分提供),它是另一个故事:

{{1}}

答案 1 :(得分:3)

编译器不知道a和b的值,因此它不会将其视为具有无法访问语句的无限循环。

另一方面,使用while(true),编译器知道会有麻烦。

答案 2 :(得分:1)

Java语言规范在14.21. Unreachable Statements中为编译时错误提供了特定的规则。

适用于示例代码的规则是:

  

while语句可以正常完成iff至少其中一个   以下是真的:

The while statement is reachable and the condition expression is not a constant expression (§15.28) with value true.

There is a reachable break statement that exits the while statement.

对于示例1,两个条件中的第一个为真,但对于示例2,则为假。对于两个示例,第二个条件为假。就语言规范而言,第一个循环可能正常完成,允许控制达到以下语句。第二个例子没有这种可能性。

规则有两个好处。无论编译器的选择如何,对于一系列字符是否构成可编译的Java程序,都有一套规则。规则可以非常简单地实施。