Rav*_*avi 2 java if-statement while-loop control-flow unreachable-statement
可能重复:
为什么此代码出现"无法访问的语句"错误?
这似乎是一个非常简单的问题,我在一本书中找到了这个问题.如果有人帮我弄清楚为什么我会收到错误.
do {
System.out.print("inside do");
} while (false);
while (false) { // error
System.out.print("inside while");
}
System.out.print("outside");
Run Code Online (Sandbox Code Playgroud)
我想,根据我的说法,输出应该在dooutside里面.但是,它显示编译器错误:无法访问的语句.然后,我试图找出,为什么,它显示编译错误:无法到达的语句*.所以,我改变了上面这样的代码
boolean i = false;
do {
System.out.print("inside do");
} while (false);
while (i) { // ok
System.out.print("inside while");
}
System.out.print("outside");
Run Code Online (Sandbox Code Playgroud)
现在,它显示了预期的输出,即在dooutside内.所以,我的问题是 - 第一和第二种情况有什么不同?另外,当我检查
if(false){
//something here
}
Run Code Online (Sandbox Code Playgroud)
然后,上面的代码执行没有任何错误.
编译器为您提供了无法访问的语句错误,因为System.out.print("inside while");永远无法访问您的代码
while (false) { // error
System.out.print("inside while");
}
Run Code Online (Sandbox Code Playgroud)
编译器知道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; }我们的想法是,应该可以将
DEBUGfalse 的值更改为true或者将true更改为false,然后正确编译代码而不对程序文本进行其他更改.
| 归档时间: |
|
| 查看次数: |
3390 次 |
| 最近记录: |