代码捕捉如下所示:
public static void main(String[] args) {
System.out.println(echo("jjj"));
}
public static String echo(String str) {
try {
int a = 1/0;
} catch (Exception e) {
throw e;
} finally {
return str;
}
}
为什么我可以获得输出并且不会发生异常?
如果我最后退出return子句,那么就会发生异常
return
(在finally
中)如何停止exception
?
答案 0 :(得分:1)
Java Language Specification section 14.20.2中明确指出了此行为,其中包含:
首先执行带有finally块的try语句 试块。然后有一个选择:
如果try块的执行正常完成,那么finally 块被执行,然后有一个选择:
如果finally块正常完成,则try语句正常完成。
如果finally块因原因S而突然完成,则try语句突然完成,原因是S。
如果由于a而导致try块的执行突然完成 抛出一个值V ,然后有一个选择:
如果V的运行时类型与try语句的任何catch子句的可捕获异常类兼容,则 然后选择第一个(最左边)这样的catch子句。值V 被分配给所选catch子句的参数,以及 执行该catch子句的块。然后有一个选择:
如果catch块正常完成,则执行finally块。然后有一个选择:
如果finally块正常完成,则try语句正常完成。
如果finally块因任何原因突然完成,则try语句会因同样的原因突然完成。
如果catch块因R而突然完成,则执行finally块。然后有一个选择:
如果finally块正常完成,则try语句突然完成,原因为R。
如果finally块因为S而突然完成,则try语句突然完成,原因是S(和原因R) 被丢弃了。
(请注意"抛出异常""返回值"算作"突然完成。")