2015-04-05 48 views
1

当我使用下面的代码,编译错误发生。好奇,是否条件和例外

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

回答

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)因为真正的是一个常量表达式,它仍然认为if后的代码可以到达,因为它假定这if块是存在有条件地执行一些用于调试原因的代码。您必须能够将常量表达式从false更改为true,反之亦然,并且不会修改代码中的其他任何内容以使其进行编译。