Java中Return和Finally运行顺序的实现
以下这段代码的运行结果是如何的呢?
- publc int test(){
- int x;
- try{
- ;
- return x;
- }catch(Exception e){
- ;
- return x;
- }finally{
- ;
- }
- }
相信对Java比較熟悉的朋友立即会说出正确答案:正常返回1。异常返回2。
我第一次看到这段代码时,对于finally里面的x=3产生了疑惑,不确定最后返回的x是否变成了3。直到从《深入理解Java虚拟机》里面找到了这段代码的字节码,才明确其执行机制。
以下是上面这段Java代码的字节码:
- public int test();
- Code:
- , Locals=5, Args_size=1
- : iconst_1 //将1写入栈顶
- : istore_1 //将栈顶值(1)写入第2个int型本地变量
- : iload_1 //将第2<span style="font-family: Arial, Helvetica, sans-serif;">个int型本地变量load到栈顶(Return语句的開始)</span>
- : istore 4 //保存栈顶值到<span style="font-family: Arial, Helvetica, sans-serif;">第4个int型本地变量</span>,此时x=1
- : iconst_3 //将3写入栈顶(Finally開始)
- : istore_1 //将3写入<span style="font-family: Arial, Helvetica, sans-serif;">第2个int型本地变量</span>
- : iload 4 //将<span style="font-family: Arial, Helvetica, sans-serif;">第4个int型本地变量的值laod到栈顶</span>
- : ireturn //返回栈顶的值
- : astore_2
- : iconst_2
- : istore_1
- : iload_1
- : istore 4
- : iconst_3
- : istore_1
- : iload 4
- : ireturn
- : astore_3
- : iconst_3
- : istore_1
- : aload_3
- : athrow
从上面的字节码能够看出,Return语句被分为两部分:iload 4和ireturn,在store和load之间插入的是finally代码。x的值首先被存放到一个指定的位置,再运行finally语句。这时finally中的代码已无法影响返回值了。
Java中Return和Finally运行顺序的实现的更多相关文章
- Java中Return和Finally执行顺序的实现
下面这段代码的执行结果是怎样的呢? publc int test(){ int x; try{ x = 1; return x; }catch(Exception e){ x = 2; return ...
- Java中常用的查找算法——顺序查找和二分查找
Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...
- Java中的查找算法之顺序查找(Sequential Search)
Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...
- 经典的java中return和finally问题!
经典的java中return和finally问题! 标签: 杂谈 分类: java学习 前一段时间 参加公司的笔试问了这个问题,回来一查才知道当时自己做错了,百思不得其解,上网查到下面的程序,但是运行 ...
- 面试官:Java中线程是按什么顺序执行的?
摘要:Java中多线程并发的执行顺序历来是面试中的重点,掌握Java中线程的执行顺序不仅能够在面试中让你脱颖而出,更能够让你在平时的工作中,迅速定位由于多线程并发问题导致的"诡异" ...
- java中return在Try-Catch中的执行顺序
我们知道return会结束此方法并返回指定值.以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的.但是如果return包含在try-catch- ...
- java中的代码块执行顺序
/* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代码.每次 ...
- java中如何使正在运行中的线程退出
终止线程的三种方法 有三种方法可以使终止线程. 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2. 使用stop方法强行终止线程(这个方法不 ...
- Java中静态数据的初始化顺序
Java的类中的数据成员中包含有静态成员(static)时,静态数据成员的初始化顺序是怎样的呢? [程序实例1] import java.util.*; import java.lang.*; imp ...
随机推荐
- Oracle password expire notices
/usr/local/webserver/tomcat6/logs/logbak/zsxxw.log.2015-03-21.txt:2015-03-22 00:47:26,366 ORA-28002: ...
- C app
1,C 输入输出字符串
- 基于winform的二进制图片数据的存取(用于数据库照片的读写处理)
编程目的:文本框1中输入id号,则从openFileDialog中选择的图片会以二进制数据存进SQL数据库的对应表的id列:文本框2中输入姓名,从数据库读取对应name的照片并显示在pictureBo ...
- 【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...
- android JNI库实现reboot,recovery
1.recovery函数: #define UPDATE_TITLE "--update_package=" #define UPDATE_COMMAND_FILE "/ ...
- Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等
写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类 ...
- 存储和读取MYSQL时间戳
from_unixtime(date,'%Y%m%d')是MySQL里的时间函数date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串后面的 '%Y%m ...
- node.js url模块
URL url.parse(urlStr[, parseQueryString][, slashesDenoteHost]) url.format(urlObj) url.resolve(from, ...
- 点击TextView浏览器打开指定网页
直接上代码: /** * 点击跳转到版权页面 */ private void getCopyRight() { // TODO Auto-generated method stub TextView ...
- 02js高级Function
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...