try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行?

这个我本来理解清楚了,是return前准确来说是return中执行的,但是今天一看相关的又迷糊了,所以做个笔记记录一下。迷糊的主要是看finally中有没有return。

①没有return:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? - 云+社区 - 腾讯云 (tencent.com

 

 

 

 

public class FinallyDemo2 {
         public static void main(String[] args) {
             System.out.println(getInt());
         }
     
         public static int getInt() {
             int a = 10;
             try {
                 System.out.println(a / 0);
                 a = 20;
             } catch (ArithmeticException e) {
                 a = 30;
                 return a;
                 /*
                  * return a; 在程序执行到这一步的时候,这里不是return a; 而是return 30; 这个返回路径就形成了。
                  * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
                  * 再次回到以前的返回路径,继续走 return 30;
                  */
             } finally {
                 a = 40;
                 // return a; // 如果这样结果就是40了。这样的话就产生了一个新的返回路径。
             }
             
             return a;
         }
     }
  //返回30

②如果finally有return,用另一个代码方便理解:

package exception;
 
public class TestException {
 
    public static int method() {
        try {
            return return1();
        } catch (Exception e) {
            return return2();
        } finally {
            return return3();
        }
    }
 
    private static int return1() {
        System.out.println("return 1");
        return 1;
    }
    private static int return2() {
        System.out.println("return 2");
        return 2;
    }
    private static int return3() {
        System.out.println("return 3");
        return 3;
    }
 
    public static void main(String[] args) {
        int result = method();
        System.out.println("result:" + result);
         
    }
}

 

 看完这两个结果应该就很好理解了,总结起来就是,先执行try,看里面的代码有没有错,有错的话执行catch,没错执行到return,有错执行到catch中的return,在到return时,再执行finally的方法(注意return后面的函数是执行的,比如第二个代码输出了“return 1”,只是不返回1),finally方法如果有return 的话,执行finally中的return,之前的return 就不返回了。

容易犯错的就是比如第一个代码,按理说执行finally后,a=40,catch中返回的是a,那按理说应该是输出40,为什么是30呢,因为当执行到catch中的return a;这段代码时,计算机记录的是 return 30,而不是return a,相当于告诉你,我现在马上要return 30了,你赶紧把你的finally代码执行完,执行完我就返回了。

在网上找到了其他的说法,以供理解:

主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。 

posted @ 2022-03-07 14:01  塵暘  阅读(133)  评论(0编辑  收藏  举报