使用while循环在Java中[复制]不可达语句错误(Unreachable statement e

2019-08-04 13:00发布

可能重复:
为什么这个代码给人一种“不可达的声明”的错误?

这看起来很简单的问题,我发现这个问题在一本书。 如果有人帮我弄清楚为什么我收到提示。

    do {
        System.out.print("inside do");
    } while (false);
    while (false) { // error
        System.out.print("inside while");
    }
    System.out.print("outside");

我认为,根据我的,输出应该是里面dooutside。 但是,它显示编译器错误:无法访问声明 。 然后,我想弄明白,为什么,它显示编译错误:无法访问声明*。 所以,我改变了上面这样的代码

  boolean i = false;  
  do {
        System.out.print("inside do");
    } while (false);
    while (i) { // ok
        System.out.print("inside while");
    }
    System.out.print("outside");

现在,它正显示出,即内部dooutside预期输出。 所以,我的问题是 - 什么使在第一和第二种情况区别? 此外,当我检查

if(false){ 
  //something here
   }

然后,上述代码的执行没有任何错误。

Answer 1:

前两个实施例之间的主要区别在于,在第一种情况下,条件是恒定的,而在第二个事实并非如此。

例如,如果你改变boolean i = false;final boolean i = false; ,你会得到相同的编译错误,因为我现在是一个常数。

无法访问的语句的规则中定义JLS 14.21 。 尤其是,存在一个特殊的治疗if允许if(DEBUG)结构,其中DEBUG可能是一个常数。

对于do / while ,因此不存在问题,里面的语句会被执行一次。

有关常量更多细节此相关的帖子 。



Answer 2:

编译器给你一个无法语句错误,因为你System.out.print("inside while"); 代码可以从不到达

while (false) { // error
    System.out.print("inside while");
}

编译器知道while (false)永远是真实的,并警告你(有错误),有关死代码。

相反,如果你把一个变量中while不是,因为变量的本质是,它可以改变 (改变),编译器的静态分析不标识可达代码。 (即使在很多情况下,你或者我可以看着它说:“这些代码永远不会运行”;编译器的分析是相当浅,这不是它的主要工作有更强壮的分析和代码覆盖工具,你可以使用。)

在问候if (false) ,下面介绍一下JLS不得不说一下吧 :

作为一个例子,下面的语句导致编译时错误:

while (false) { x=3; }

因为语句x=3 ; 不可达; 但表面上相似的情况:

if (false) { x=3; }

不会导致编译时错误。 优化编译器可实现该语句x=3; 将永远不会被执行,并且可以选择省略用于从所生成的类文件语句的代码,但声明x=3; 在这里指定的技术意义上是不被视为“无法访问”。

这种区别对待的理由是让程序员定义“标志变量”,如:

static final boolean DEBUG = false;

然后写代码,例如:

if (DEBUG) { x=3; }

我们的想法是,它应该是可能的值更改DEBUG从假到真或从真到假,然后用无其他修改程序文本正确编译代码。



文章来源: Unreachable statement error using while loop in java [duplicate]