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

问到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语句块中的代码,最后再执行终止的作用呢?

时间: 2024-12-29 12:03:56

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

分类信息之争又将持续 赶集网化险但还未为夷

赶集网获得老虎基金和凯雷投资2亿美元投资的消息一出,再次引爆整个互联网,分类信息市场再起波澜.新一轮融资之后,赶集网成功化险,之前捉襟见肘的资金问题得到妥善解决. 舆论唱空不管用?老虎凯雷豪赌赶集网 在赶集网宣布获得老虎基金和凯雷投资新一轮2亿美元融资之后,业界舆论砸开了锅,虽然仍有不少围观者对赶集网持悲观的态度,但更多的人是好奇为何被老虎凯雷会豪赌被唱空了半年之久的赶集网. 其实也不难理解,在腾讯投资58同城之后,分类信息市场彻底被激活,尤其是资本市场,在腾讯的带动下更加不会错过这次机会.腾讯

【CodeForces】343D Water tree (线段树好题!还未弄懂)

/* 此题的方法除了用线段树求子树,通过标记父亲,更新儿子的方法,来更新祖先,学习了. 对于建树的方法由于并没有说明父亲与儿子的顺序,所以需要通过两次添加. 并且pre变量可以获得父亲的位置,还未弄懂! */ #define _CRT_SECURE_NO_WARNINGS #include<cstring> #include<cstdio> #include<iostream> #include<algorithm> using namespace std;

照片墙效果(交换位置还未实现)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <st

窗外,夏季似乎还未离去

窗外,夏季似乎还未离去.只有在一阵阵秋雨过后,才能闻到那股秋季的凉意.对于秋天,总有一种说不出的留恋,留念着秋天那份薄凉,留念着曾经的自己,留恋着曾经的许多人,许多事,留恋着那些已经回不到过去的旧时光. 思绪里,似乎闻到了桂花飘香的味道,依旧是那股泛着淡淡的暗香.脑海中浮现了当初那群带着青涩与单纯的少年,就是在这样的季节里相聚在一起,而后一起经过了数个春秋,在那段葱茏的时光里留下一点一滴的痕迹. http://www.huxiu.com/group/thread/504554http://www

阿里云香港机房故障(到现在还未解决)

早上10点被客户电话叫醒,到现在问题还未解决.联系了就说是香港网络运营商问题,会尽快修复,可连具体时间都无法提供,难道这这么等下去? 我们的客户都快爆发了,这次真害死人了. 平时看阿里挺牛B的才买了他们的云服务. 可是作为一个云服务商,遇到这种问题,竟然没有一点备用方案. 要这样的话我们使用阿里云服务还有什么保障. 有没有跟我们一样悲剧的朋友.T T. 官方公告 阿里云香港region访问异常故障 尊敬的用户,目前香港机房故障仍在处理中.对由此异常导致的服务中断,我们深表歉意.同时我们会尽快启动

VMWARE里启动kylin16.0时出现&#39;SMBus Host Controller not enabled&#39;(还未进入系统)

在Vmware里安装完Ubuntu16.10,启动时出现'SMBus Host Controller not enabled'错误提示,进不到图形界面.网上搜了一下,解决办法是在图形界面里进终端窗口,编辑blacklist.conf文件,禁止i2c_piix4驱动的加载.但现在系统还没加载完,进不去终端窗口,如何处理呢? 解决办法如下(亲测可用): 在虚拟机上运行Linux内核版本为4.7或以上的系统都在安装过程中或在启动时会因为加载intel_powerclamp驱动而导致崩溃.解决办法:1.

《速度与激情7》 大量相关域名还未被注册!

<速度与激情7>是环球影业出品的一部赛车题材动作片,由范·迪塞尔.已故演员保罗·沃克以及杰森.斯坦森等领衔主演.该片在4月12日中国内地公映,以疾风暴雨之势连破内地各项票房纪录,成为蝉联冠军. <速7>上映当天,可谓是开启了疯狂模式,各路大神可堪称是拿出了挤春运的激情去看的,小编一朋友去了首映回来说:”我算是见证了中国观众强大的激情了,买票排队.取票排队.上厕所排队.买爆米花排队.离场排队.小编想说这画面感实在是不敢想象. 其实速7之所以如此连连破纪录成为当下电影大热,离不开已去世

jquery ajax 总是还未等到success回调就刷掉了,就进入了onError函数的错误案例分析

jquery ajax 总是还未等到success回调就刷掉了,就进入了onError函数的错误案例分析: 同样的请求同时请求了2次,然后第二次的请求把第一次的给刷掉了! (比如:<div onclick="ajax(url)"><a onclick="ajax(url)">获取接口数据</a></div>)点击“获取接口数据”将触发函数ajax(url)2次!这样就有问题! 比如如果是购物车的“加入购物车”的按钮式这

白虎大厅程序搭建还未开始,就以其满满的看点,吸引了社会各界的目光

[编者按]CES 2018 还未开始,就以其满满的看点,吸引了社会各界的目光.白虎大厅程序搭建(h5.hxforum.com)企鹅2952777280首先是谷歌用霸气的广告"Hey, Google"包下拉斯维加斯的单轨铁路,气势庞大势不可挡.与去年大会上,凭借智能语音助理 Alexa 出尽风头的亚马逊的大战势必将在今年的大会上开启. CES大战开启2014 年 11 月 6 日,亚马逊在其官网低调地宣布了一款名为 Amazon Echo 的家庭智能音箱,没有发布会.在随后的两年内,Ec