• 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

  • 相关阅读:
    Mycat适合场景及不适合场景
    solr与Elasticsearch对比
    分布式搜索之搭建Solrcloud(Solr集群)
    Mysql索引最左匹配原则
    CAS实现单点登录SSO执行原理及部署
    Spring Cloud,Dubbo及HSF对比
    Dubbo支持的协议的详解
    Dubbo架构设计详解
    几种分布式锁的实现方式
    深入分析volatile的实现原理
  • 原文地址:https://www.cnblogs.com/princessd8251/p/4003771.html
Copyright © 2020-2023  润新知