码迷,mamicode.com
首页 > 其他好文 > 详细

还未打破的砂锅之——深究finally代码块与return语句的执行顺序!

时间:2015-10-29 00:40:48      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

问到finally代码块的执行顺序,就算刚刚学编程的新手都能好不犹豫的说出答案:不管异常与否,finally语句块的代码一定会被执行!虽然博主尚未完全搞懂其中奥妙,但是希望下面的代码能引起读者的深思,有人觉得明白与否没有太大意义,但我相信每个向上的人面对知识时都要有一颗近乎朝圣的心,因为我们是站在巨人或前人的肩膀上前进,因为我们还很渺小!其实明白与否很有意义,因为它涉及着你以后在finally代码块中的逻辑。话不多说,请看代码:

public class finallyTest
{
    public static void main(String[] args)
    {
        System.out.println("main: x = "+test());
    }
    private static int test() {
        int x = 1;
        try{
            System.out.println("try: x = "+x);
            return x;            
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally{
            ++x;
            System.out.println("finally: x = "+x);
        }
    }
}

运行结果如下:

技术分享

从运行结果上分析,try语句中代码先执行这是毫无疑问了,此时 x=1, 然后根据我们以往所了解的一样,在return语句之前执行finally语句块中的代码,此时 x自增1 值变为2 并输出,从结果上来看也是没有错误的,但是,请注意,在try语句块中return给主函数的 x 的值应该是2啊,怎么会是1呢?finally语句中的代码明明是执行过的了啊,此时博主就猜想,难道JVM在执行return语句的时候又开了一个线程去执行finally代码块而自己只管返回结果?于是在这样的猜想下进行了下边的验证:

在执行return语句之前阻塞500毫秒,等待finally语句块执行完毕后再让return语句返回x的值,那么这次的结果会如何呢???

import java.util.*;
import java.text.*;
public class finallyTest
{
    static int x = 1;
    public static void main(String[] args)
    {
        System.out.println("main: x = "+test() +" : "+printTime());
    }
    private static int test() {
    
        try{
            System.out.println("try: x = "+x +" :  "+printTime());
            Thread.sleep(500);
            return x;            
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally{
            ++x;
            System.out.println("finally: x = "+x +" :"+printTime());
        }
    }

    //打印当前时间 格式为: 分:秒:毫秒
    public static String printTime(){ 
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat sdf = new SimpleDateFormat("mm:ss:SS");
        return sdf.format(date);
        
    }
}

执行结果如下:

技术分享

相信读者读到这一步会不会觉得奇怪呢?会不会觉得耐人寻味呢?明明 x 的值已经变成2了但是主函数接受到的仍然是1,这究竟是为什么呢?于是博主就四处搜寻了一些有关方面的介绍,于是有了如下猜想:众所周知,return语句有两个作用,一是返回结果,二是终止执行,那么会不会是在执行到return语句时,先将x的值返回给调用者,然后再执行finally语句块中的代码,最后再执行终止的作用呢?

还未打破的砂锅之——深究finally代码块与return语句的执行顺序!

标签:

原文地址:http://www.cnblogs.com/rookieFly-tdiitd/p/4919048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!