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.

  • 相关阅读:
    逻辑回归---sklearn
    逻辑回归---梯度下降法
    线回与非线回---线性回归标准方程法
    线回与非线回---sklearn--多项式回归
    线回与非线回---sklearn--多元线性回归
    web前端2020/1/20学习笔记
    web前端2020/1/18-2020/1/19学习笔记
    web前端2020/1/17学习笔记
    java2020/1/16学习笔记
    web前端2020/1/16学习笔记
  • 原文地址:https://www.cnblogs.com/Toddll/p/7460044.html
Copyright © 2011-2022 走看看