对条件和异常感到好奇

时间:2015-04-05 07:11:26

标签: java if-statement exception-handling

当我使用下面这段代码时,会发生编译错误。

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也永远不会被执行。那么为什么它不被视为编译错误。 (我知道它不是编译错误:|。可能是,表示它的其他一些方式。)它是给程序员的选择吗?

1 个答案:

答案 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,反之亦然,而不是修改代码中的任何其他内容以使其编译。