当我使用下面这段代码时,会发生编译错误。
try {
throw new Exception("Exceptionist");
System.out.println("another line"); //compilation error
}catch (Exception e) {
System.out.println("Exception:" + e.getMessage());
}
编译错误的原因是我们在抛出异常后无法编写代码。 但是,当我尝试这样的事情时
try {
if (true)
throw new Exception("Exceptionist");
System.out.println("another line"); // no compilation
} catch (Exception e) {
System.out.println("Exception:" + e.getMessage());
}
即使Eclipse IDE将syso预测为死代码,为什么java不会指出它。即使它被编译成字节码,syso也永远不会被执行。那么为什么它不被视为编译错误。 (我知道它不是编译错误:|。可能是,表示它的其他一些方式。)它是给程序员的选择吗?
答案 0 :(得分:3)
解释在Java Language Specification:
如果语句因无法访问而无法执行,则为编译时错误。
[...]
if (false) { x=3; }
不会导致编译时错误。优化编译器可以实现语句x = 3;将永远不会执行,并可能选择从生成的类文件中省略该语句的代码,但语句x = 3;不被视为"无法到达"在这里指定的技术意义上。
这种不同处理的基本原理是允许程序员定义"标志变量"如:
static final boolean DEBUG = false;
然后编写如下代码:
if (DEBUG) { x=3; }
这个想法是应该可以将DEBUG的值从false更改为true或从true更改为false,然后正确编译代码而不对程序文本进行其他更改。
因此,即使编译器确实可以从字节码中删除if (true)
,因为true是一个常量表达式,它仍然认为if
之后的代码是可以访问的,因为它假定为if
1}}块有条件地执行一些代码用于调试原因。您必须能够将常量表达式从false
更改为true
,反之亦然,而不是修改代码中的任何其他内容以使其编译。