Java While循环布尔求值
例1: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运行时没有错误,为什么
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.