Finally 与 Java 异常处理的规则
本文转载自:https://juejin.im/post/5ea809115188256d42660bbe
题目如下:

对于这个问题,该是什么了,有的人说是int try,有的说是finally,有的说的两个都输出,那么正确答案是什么了?
Java 异常

异常处理
try{ //可能发生异常 }catch(Exception e){ //捕获异常 }finally{ // 有无异常都会执行 }
finally 中的代码有以下情况:
- 1 没有异常发生,在try结束后执行
- 2 有异常发生并被捕获,在catch执行后执行
- 3 有异常发生但没有捕获,则异常在被抛给上层之前执行
return
public static int foo() { int ret = 0; try { int a = 1;return ret; } finally { ret = 2; } }
结论:这个函数返回值是1,而不是2,因为函数执行到try内return语句之前,会将返回值保存到一个临时变量中,然后执行finally语句,最后在返回那个临时变量,即finally对ret的修改不会生效。
return
public static int foo() { int ret = 0; try { int a = 10 / 0; return ret; } finally { ret = 2; return ret; } }
结论: 输出2
原因:a = 10 / 0 会抛出ArithmeticException,finally中有return不仅会覆盖try和catch的值,还会掩盖try和catch的异常
return
public static int foo() { int ret = 0; try { int a = 10 / 0; return ret; } finally { throw new NullPointerException("NullPointerException"); } }
finally中异常会覆盖try和catch的异常
题目答案
符合规则3,既只会输出finally

浙公网安备 33010602011771号