zoukankan      html  css  js  c++  java
  • try catch finally返回值和临时栈

    先来看一段代码:

    public abstract class Test {
        public static void main(String[] args) {
            System.out.println(beforeFinally());
        }
         
        public static int beforeFinally(){
            int a = 0;
            try{
                a = 1;
                return a;
            }finally{
                a = 2;
            }
        }
    }
    /**output:
    1
    */

    从结果上看,貌似`finally` 里的语句是在`return` 之后执行的,其实不然,实际上`finally` 里的语句是在在`return` 之前执行的。那么问题来了,既然是在之前执行,那为什么`a` 的值没有被覆盖了?
    实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行`a = 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。
    再来看一个例子,稍微改下上面的程序:

    public abstract class Test {
        public static void main(String[] args) {
            System.out.println(beforeFinally());
        }
         
        public static int beforeFinally(){
            int a = 0;
            try{
                a = 1;
                return a;
            }finally{
                a = 2;
                return a;
            }
        }
    }
    /**output:
    2
    */

    在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.

  • 相关阅读:
    不敢想,做个博客竟如此简单!
    我有一台服务器,能干啥?
    精品 IDEA 插件大汇总!值得收藏
    怒肝半月!Python 学习路线+资源大汇总
    怒肝 Linux 学习路线,这回不难
    多环境
    分享 10 个高星的创意项目!
    js的attribute
    选择大厂该做哪些准备?|小白进入大厂现状
    小白程序猿了解大厂的开发模式
  • 原文地址:https://www.cnblogs.com/Toddll/p/7460044.html
Copyright © 2011-2022 走看看