什么时候条件"无法访问代码"发生在Java?

时间:2014-06-12 09:34:11

标签: java unreachable-code

当在无限循环之后写入某些语句时,该语句将成为无法访问的代码。例如:

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语句是无法访问的。

问题:

  1. 为什么会这样?

  2. 任何人都可以告诉我确切的规则,看看代码是否无法访问。

2 个答案:

答案 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.