当在无限循环之后写入某些语句时,该语句将成为无法访问的代码。例如:
for(;;)
{
}
Sytem.out.println("Test-1"); //unreachable code
但我在这里面临一些困难。
请查看以下两个代码段:
代码段1:
for(final int z=4;z<6;)
{
}
System.out.println("Test-2"); //unreachable code
这里,最后一个语句必须是不可达的,因为循环是无限的,输出是预期的。
Code Snippet2:
final int z=4;
for(;;)
{
if(z<2)
break;
}
System.out.println("Test-3"); //not unreachable
从概念上讲,上面代码中的for循环也是无限的,因为z是final,if(z<2)
仅在编译时确定.if条件永远不会为真且循环永远不会中断。
但是,上面代码中的Last语句是无法访问的。
问题:
为什么会这样?
任何人都可以告诉我确切的规则,看看代码是否无法访问。
答案 0 :(得分:3)
http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21中的关键词是:
如果由于无法执行语句,则是编译时错误 它无法到达。
本节致力于对该词的精确解释 “可达”。这个想法是必须有一些可能的执行 从构造函数,方法,实例的开头的路径 初始化程序,或包含语句的静态初始化程序 声明本身。分析考虑了结构 声明。 除了while,do和for的特殊处理 条件表达式具有常量值true的语句 流分析中不考虑表达式的值。
因此,编译器不会在z<2
语句中评估if()
,也不知道
永远不会评估为true
。
就Java规范而言,这定义了无法访问的代码。编译器遵守规范是很重要的,因为更改规则可能会使用于编译的代码无法编译。
但是,编译器可以自由地提供警告而不是编译错误。
如果我在Eclipse中输入以下代码:
final int x = 0;
if(x == 1) {
System.out.println("This never happens");
}
......我收到警告“死码”。编译器知道无法访问代码 - 但是它不能拒绝编译,因为根据Java规范,代码不能正式“无法访问”。
答案 1 :(得分:0)
for(final int z=4;z<6;)
{
}
System.out.println("Test-2"); //unreachable code --> z is final. Its value can't change. There is no way out of that loop
final int z=4;
for(;;)
{
if(z<2) // z is 4 . The compiler only knows the value of "z". It doesn't know what z<2 evaluates to.. So, it still thinks taht there is a chance of getting out of that loop.
break;
}
System.out.println("Test-3"); //So --> reachable code.