Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java While循环布尔求值_Java - Fatal编程技术网

Java While循环布尔求值

Java While循环布尔求值,java,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"); } } 示例1运行时没有错误,为什么

例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");
    }
}
示例1运行时没有错误,为什么示例2中会出现编译时错误?

因为编译器“聪明”到知道
而(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");
}

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


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

Java语言规范给出了编译时错误的具体规则

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

while语句通常可以在至少一个 事实如下:

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,这两个条件中的第一个为true,但对于示例2,这两个条件中的第一个为false。第二个条件对于这两个例子都是错误的。就语言规范而言,第一个循环可能会正常完成,从而允许控制到达以下语句。第二个例子没有这种可能性


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

严格来说,这不是编译器的聪明。相反,编译器正在实现Java语言规范中规定的确定代码可达性的规则。一个案例是法律法规,另一个不是。。。根据JLS。@Mena非常感谢:)现在我已经正确理解了,不需要将它们设置为静态最终字段。只需在
a
b
的现有本地声明中添加“final”一词,它们的比较就会成为一个常量表达式,值为true。在@PatriciaShanahan的注释中添加更多内容—请注意,在实例级声明中添加
final
不会使其成为编译时常量。只有
static final
final
(对于方法局部变量)将使字段成为编译时常量
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.