zoukankan      html  css  js  c++  java
  • try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?

      这是一道面试题,首先finally{}里面的code肯定是会执行的,至于在return前还是后,

    看答案说的是在return后执行,我觉得不对,百度了一下,有说return前的,有说return后的,还有return中间执行的。遂做了一个小测试如下:

            static void Main(string[] args)
            {
                 //测试
                Test();
                System.Console.WriteLine("结束了");
                System.Console.ReadLine();
            }
    
            /// <summary>
            /// 测试
            /// </summary>
            /// <returns></returns>
            private static int Test()
            {
                try
                {
                    System.Console.WriteLine("好,开始了");
                    return ReturnInt();
                }
                catch (Exception exception)
                {
                    System.Console.WriteLine("我是异常");
                    throw;
                }
                finally
                {
                    System.Console.WriteLine("我是finally");
                }
            }
    
           /// <summary>
           /// 返回数字
           /// </summary>
           /// <returns></returns>
            private static int ReturnInt()
            {
                System.Console.WriteLine("我是return");
                return 1;
            }
    

      测试结果如下:

      

      所以我觉得finally{}里面的code是在return之后执行的。

      此测试较粗糙,如有其它方法证明,望告知。

    ----------------------------------------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------------------------------------------------------------------------------

      之前的测试果然很粗糙,搞错了一个概念,return到底是在什么时候才算执行,什么时候执行完。上面打印“我是return”的时候,我以为是return执行完了,其实那个时候只是去准备return的返回值去了,并没有真正的返回“1”并跳出Test()方法,准备好返回值之后,接着去执行finally{}里面的code,打印了“我是finally”,最后Test()方法才算执行完,并真正的返回(return)“1”到main里面。

    按照@以后会觉得昵称很幼稚 老哥的提醒,修改了一下main()里面的代码,

            static void Main(string[] args)
            {
                //测试
                Console.WriteLine("Test结果:" + Test());
                System.Console.WriteLine("结束了");
                System.Console.ReadLine();
            }
    

      结果如下:

      

      所以finally{}里面的code应该是在return之前执行的。

      在http://bbs.csdn.net/topics/60474475 此贴中,五楼的老哥的话,“函数应该是栈调用,如果先执行return ,哪不是退到上个栈了,怎么调用finally, 所以我觉得先调用finally”,

      在http://blog.csdn.net/gaoyuanfeng/article/details/4064388 文章中,finally与return的关系也讲得很明白了,这一天天的真是受教了。

  • 相关阅读:
    04 链表(上):如何实现LRU缓存淘汰算法?
    03 数组:为什么很多编程语言中数组都从0开始编号?
    02 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
    01 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
    Winform PictureBox图片旋转
    我的第一篇博客
    redis分布式锁实现与思考
    java 时间字符串中毫秒值时有时无,怎么解析
    spring 接收处理 json 类型的请求(spring 默认使用jackson 处理接收的数据), json 字段的中的Date 类型会自动 转换为 Long 类型
    java 中的正则使用
  • 原文地址:https://www.cnblogs.com/bookobe/p/8491041.html
Copyright © 2011-2022 走看看