zoukankan      html  css  js  c++  java
  • Finally的执行时机

    有人问下面代码是return先执行,还是finally先执行.

    int i = 1;
    try{
        return i;
    }finally{
      i = 0;
    }

    很多人都回答是finally先执行,因为他们知道是返回0.但是其实真正意义上来讲是return先开始执行的,只是return中间会跳转到Finally代码执行,然后再跳转回来。

    return的执行 是分两步的 第一步计算return 右边表达式的值,然后进行返回。

    Finally 在return的右边表达式计算完毕后执行,当Finally执行完毕后,return正式返回右边表达式的值.
    所以我们才称之 “在return语句的中间执行”
    在上面例子中,右边表达式简单,但是也要计算的,只是直接得到计算结果而已。然后执行finally,最后返回0.
    看看下面的例子,你就明白了。

    package test;

    public class FinallyTest {
            
    public static Container test(){
            Container c = new Container();
            try{
                return print(c);//由于返回的是对象,所以进行对象引用传递.,所以return语句最后就是返回一个执行c对象的引用.
            }finally{
                    System.out.println("Finally Executed");
                    c.i = 0;
            }
    }

    public static Container print(Container c){
            System.out.println("Return Executed");
            System.out.println("print i="+c.i);
            return c;
    }

    public static void main(String[] args){
            System.out.println("main i="+test().i);
    }

    static class Container{
            public int i = 1;
    }

    }

    输入如下:
    Return Executed
    print i=1
    Finally Executed
    main i=0

  • 相关阅读:
    随意谈谈tcp
    %matplotlib inline 被注释掉后,pycharm不能生成图
    (转)SQL Server 2012 手动安装帮助文档+排错
    (转)线性回归数学推导(详细过程)
    numpy的函数使用
    SQL 测验题目(30道)
    SourceInsight 支持 Python
    (转)GitHub上想下载单个文件方法
    (转)SQL Server 数据类型映射
    数据库的基本使用(C#语言)
  • 原文地址:https://www.cnblogs.com/princessd8251/p/4003771.html
Copyright © 2011-2022 走看看