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

 

posted @ 2020-04-29 10:24  灰色飘零  阅读(272)  评论(0)    收藏  举报