为什么代码
void methodThrowsException() /*throws Exception*/{
try {
// throw new Exception();
} catch (Exception e) {
throw e;
}
}
以及编译?因为它可以抛出一个异常或不AFAIK编译器不分析代码。这里明显throw e;
不会运行(由于评论// throw new Exception();
),但为什么编译器知道这一点?
javac编译器确实没有做太多优化。但是,简单的死代码检测和优化技术还没有可能的。
在您的例子:编译器可以很容易地检测到try块是空的。空try块不能扔,所以所有catch块的代码基本上是死的。
因此,编译器会去和简单的下降整个try / catch语句完全在这里。然后有可能抛出一个异常所剩无几。
其中,当我们使用javap的正是我们在寻找的字节码:
void methodThrowsException();
Code:
0: return
是的,对方的回答是完全正确的:因为你使用Exception
这只是以这种方式工作,更具体的(选中)子类会导致编译错误。
编译器将检测未如抛出具体的检查异常
void methodThrowsException() {
try {
} catch (URISyntaxException e) {
throw e;
}
}
会导致编译器错误:
exception java.net.URISyntaxException is never thrown in body of corresponding try statement
但它不会检查运行时异常,或异常层次的根类型,如Exception
,Error
,Throwable
。这在JLS 11.2.3. Exception Checking解释。