kau*_*nha 5 java exception-handling exception
public class CheckProg {
public int math(int i) {
try {
int result = i / 0;
// throw new IOException("in here");
} catch (Exception e) {
return 10;
} finally {
return 11;
}
}
public static void main(String[] args) {
CheckProg c1 = new CheckProg();
int res = c1.math(10);
System.out.println("Output :" + res);
}
Run Code Online (Sandbox Code Playgroud)
问:如果我运行上面的代码,我得到的结果为输出:11
为什么?不应该在catch块之前捕获异常并返回吗?
不应该在catch块之前捕获异常并返回吗?
它是被抓,那return语句被执行......但随后的返回值由return语句被有效地代替finally块,这将执行是否存在是个例外.
有关所有可能性的详细信息,请参阅JLS 14.20.2.在您的情况下,这是路径:
如果try块的执行由于抛出值V而突然完成,那么有一个选择:
如果V的运行时类型与try语句的任何catch子句的可捕获异常类兼容,则选择第一个(最左边)这样的catch子句.值V分配给所选catch子句的参数,并执行该catch子句的Block.然后有一个选择:
如果catch块正常完成[...被忽略,因为它没有]
如果catch块由于原因R突然完成,则执行finally块.然后有一个选择:
如果finally块正常完成[...被忽略,因为它没有]
如果finally块由于原因S而突然完成,则try语句突然完成,原因S(并且原因R被丢弃).
因此底线是重要的 - "原因S"(在我们的例子中,返回值11)最终成为try语句突然完成的方式.