for(int i=0;true;i++){
System.out.println("hi");
break;
}
for(int i=0;false;i++){
System.out.println("hi");
break;
}
第一个代码执行完美,但是第二个代码显示以下错误:
prog.java:12: error: unreachable statement
for(int i=0; false;i++){
^
1个错误
答案 0 :(得分:3)
您得到的错误是:
无法到达的声明
,它引用for
块中的代码。
这意味着该行:
System.out.println("hi");
将永远不会执行,因为for
的条件(终止表达式)从一开始就是正确的(并且永远是false
。)
在这里找到有关的更多信息:The for Statement
答案 1 :(得分:3)
Java中无法访问的代码是编译错误。在您编写的第二个for循环中,“ false”表示控件将永远不会进入“ for循环主体”,从而使其无法访问代码,从而导致编译错误。
答案 2 :(得分:2)
这里有几点要学习。
当编译器在编译时可以检测到部分代码不可访问时,它将对其进行标记,以帮助您尽快检测到问题。因此,在一个条件为if
的{{1}}语句中,该语句部分不可访问,并被标记为这样。
像false
和for (init; condition;expr) statement
这样的循环甚至在运行该语句之前都要检查其条件。因此,如果条件为while (condition) statement
,则该语句将永远不会执行。因此,发生同样的事情就像在条件为false
的{{1}}语句中一样。
必须在编译时解决条件。像
if
在编译时不被认为是已知的,但是false
和boolean a = false;
while (a) ...
在编译时是已知的,因为它们是文字。
false
不会发生这种情况,因为当编译器知道条件为true
时,它知道循环将至少进入一次。因此,true
没有类似的错误,实际上,true
类型的循环非常普遍。
答案 3 :(得分:1)
请记住,编译器可能将其检测为无法访问的代码的某些情况标记为无效代码。例如:
这可以编译并正常运行(尽管Eclipse中的默认设置是发出警告)。
public int foo() {
if (true) {
return 10;
}
return 5; // dead code (but it is definitely unreachable).
}
另一方面,这也是编译器可以识别为无法访问的代码,但不能(幸运的是)的东西。
DEBUG
在程序执行期间永远不能更改。由final
保证。但是代码可以很好地编译并运行。实际上,整个if clause
已被删除,并且没有出现在字节码中。这对于将这样的语句撒入代码中然后通过简单地将DEBUG从true更改为false来删除它们很有用。
final static boolean DEBUG = false;
public int bar(int v) {
if (DEBUG) {
System.out.println("v = " + v);
}
return v*5;
}