示例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中存在编译时错误?
答案 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程序,都有一套规则。规则可以非常简单地实施。