下面这段代码的执行结果是怎样的呢?

	publc int test(){
int x;
try{
x = 1;
return x;
}catch(Exception e){
x = 2;
return x;
}finally{
x = 3;
}
}

相信对Java比较熟悉的朋友马上会说出正确答案:正常返回1,异常返回2。我第一次看到这段代码时,对于finally里面的x=3产生了疑惑,不确定最后返回的x是否变成了3,直到从《深入理解Java虚拟机》里面找到了这段代码的字节码,才明白其运行机制。下面是上面这段Java代码的字节码:

public int test();
Code:
Stack=1, Locals=5, Args_size=1
0: iconst_1 //将1写入栈顶
1: istore_1 //将栈顶值(1)写入第2个int型本地变量
2: iload_1 //将第2个int型本地变量load到栈顶(Return语句的开始)
3: istore 4 //保存栈顶值到第4个int型本地变量,此时x=1
5: iconst_3 //将3写入栈顶(Finally开始)
6: istore_1 //将3写入第2个int型本地变量
7: iload 4 //将第4个int型本地变量的值laod到栈顶
9: ireturn //返回栈顶的值
10: astore_2
11: iconst_2
12: istore_1
13: iload_1
14: istore 4
16: iconst_3
17: istore_1
18: iload 4
20: ireturn
21: astore_3
22: iconst_3
23: istore_1
24: aload_3
25: athrow

从上面的字节码可以看出,Return语句被分为两部分:istore 4和iload 4&ireturn,在store和load之间插入的是finally代码,x的值首先被存放到一个指定的位置,再执行finally语句,这时finally中的代码已无法影响返回值了。

Java中Return和Finally执行顺序的实现的更多相关文章

  1. java中的代码块执行顺序

    /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代码.每次 ...

  2. Java中Return和Finally运行顺序的实现

    以下这段代码的运行结果是如何的呢? [java] view plaincopyprint? publc int test(){ int x; try{ ; return x; }catch(Excep ...

  3. 面试官:Java中线程是按什么顺序执行的?

    摘要:Java中多线程并发的执行顺序历来是面试中的重点,掌握Java中线程的执行顺序不仅能够在面试中让你脱颖而出,更能够让你在平时的工作中,迅速定位由于多线程并发问题导致的"诡异" ...

  4. 错误处理之try、catch、finally中的return、throw执行顺序。

    今天遇到一个让人无语的代码块 try { bilSheetService.syncUser(bilWebseviceLog, userId, optType); }catch (Exception e ...

  5. 在Spring Bean的生命周期中各方法的执行顺序

    Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下十种: 通过实现 InitializingBe ...

  6. Java中常用的查找算法——顺序查找和二分查找

    Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...

  7. Java中的查找算法之顺序查找(Sequential Search)

    Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...

  8. 经典的java中return和finally问题!

    经典的java中return和finally问题! 标签: 杂谈 分类: java学习 前一段时间 参加公司的笔试问了这个问题,回来一查才知道当时自己做错了,百思不得其解,上网查到下面的程序,但是运行 ...

  9. java静态初始化块的执行顺序

    先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...

随机推荐

  1. Android 实现http通信(servlet做服务器端) HttpClient、HttpURLConnection实现登录验证

    一,写好服务器端 在eclipse或其它javaee开发工具中新建一个web项目(我这里的项目名是:Android),建一个servlet(我这里的servlet名是:LoginServlet),模拟 ...

  2. boot小知识

    lg 大, md 中等, sm 小, xs 极小. 可以单独用,也可以混合用,不同的屏幕用不同的比例. push ,pull 推拉.这个不实用. row里面可以嵌套实用row. 挤不下的时候,就会自动 ...

  3. java 读取src下的配置文件

    很多时候,我们都将配置文件放在eclipse的src目录下,这个位置,相当于,当导出可执行jar包后,配置文件放在和jar同级的目录中,比如jar包放在/opt目录下,则配置文件放在/opt下,则ja ...

  4. enter回车---焦点切换

    $(function(){ $('.enter').bind('keydown',function(e){ var inputs = $('.enter_cash'); var key = e.whi ...

  5. 常用的CDN 链接 http://cdn.code.baidu.com/ http://www.bootcdn.cn/

    http://cdn.code.baidu.com/ http://developer.baidu.com/wiki/index.php?title=docs/cplat/libs ★新浪CDN,感觉 ...

  6. nohup+命令+& 【退出终端后,程序依然在后台运行】

    [ 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令. 该命令可以忽略所有挂断(SIGHUP)信号,在你退出帐户/关闭终端之后继续运行相应的进程. nohup ...

  7. iOS 检查指定日期是否在当前日期之前

    iOS检查指定日期是否在当前日期之前, 直接上代码: - (BOOL)checkProductDate: (NSString *)tempDate { NSDateFormatter *dateFor ...

  8. Python压缩脚本编辑

    这真是一点小问题,搞死人了.主要还是两个问题, 1WinRAR,这要配置到环境变量里去.不然无法实现功能. 2 其次就是转义   r'D:\FISRT' 3  source = [r'D:\ONE'] ...

  9. vue配置stylus

    首先Vue-init webapck 随便一个name vue项目创建好之后 cnpm i  (利用淘宝镜像) cnpm i stylus stylus-loader -D 进行安装和配置 styl常 ...

  10. 条款39:明智的使用private继承

    首先看一下private继承的法则:class之间的继承关系如果是private的话,那么编译器不会将一个derived对象自动当作为一个base class对象. 从base class继承而来的所 ...