try...catch...finally...return的四角恋
java里的try...catch...finally的三角恋关系众多程序员必然是不陌生的。但是他们三者再加上一个return的话,就会难倒一大片人吧。以前就对这个知道这个问题,没系统的总结一下,结果今天女神把我问倒了。。so。。。。
下面就分别看一下吧!
case1:finally语句+try中有return:在执行到return的时候,会先执行finally里面的内容,然后再执行行try中的return。
@SuppressWarnings("finally")
static void test() {
int x = 1;
try {
logger.info("try.....");
return;
} finally {
++x;
logger.info("finally.....");
}
}
输出:
try.....
finally......
case2:case1+finally里也有return语句:try代码块中的return不执行,即在try中遇到return的时候,会先执行finally里面的内容(包括finally里面的return语句)。
public static void main(String[] args) {
logger.info(TryCatchDemo.test1());
}
@SuppressWarnings("finally")
static int test1() {
int x = 1;
try {
logger.info("try.....");
return x;
} finally {
x = x + 1;
logger.info("finally.....");
return x;
}
}
输出:
2014-04-08 16:39:23,311 INFO [TryCatchDemo.java:23] : try.....
2014-04-08 16:39:23,347 INFO [TryCatchDemo.java:27] : finally.....
2
好了,接下里是今天的重头戏了,就是偶被女神难倒的问题。
Case3:Important 我在try里return了某一个值,但是我在finally里对这个值进行了修改,那try块里返回的值是什么?先看代码。
public static void main(String[] args) {
logger.info(TryCatchDemo.test2());
}
@SuppressWarnings("finally")
static int test2() {
int x = 1;
try {
logger.info("try.....");
return x;
} finally {
++x;
logger.info("finally.....");
}
}
该代码会输出什么呢?按照我们正常的理解的话,先执行try里的语句,遇到return时候就去执行finally里的语句,然后修改了x的值为2,最后try里的return返回。
可是结果呢?
2014-04-08 16:45:37,548 INFO [TryCatchDemo.java:62] : try.....
2014-04-08 16:45:37,551 INFO [TryCatchDemo.java:66] : finally.....
2014-04-08 16:45:37,552 INFO [TryCatchDemo.java:16] : 1
结果输出的是1。说明finally里面对要返回的值进行修改,没有反应到最终的结果上去!如果是自己发现的问题的话,估计就到时为止了,下次记住就行了,可问这个问题的可是女神啊。so,屌丝决定看下这段代码编译出来的class对应的字节码,看虚拟机内部是如何执行的。
系统的环境是centos 6.4 x64
jdk环境见下图:

我们用javap -verbose TryCatchFinally >> TyrCatchFinally.txt 来把class文件字节码信息重定向到文件中。(javap是jdk自带的反编译工具命令)
这里主要是看test2部分的反编译字节码:
public int test2();
flags: ACC_PUBLIC
Code:
stack=2, locals=4, args_size=1
0: iconst_1 将整型常量1压入栈顶
1: istore_1 //将栈顶的整数出栈,并存入局部变量区的第2个变量
2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
5: ldc #7 将字符串常量压入栈顶 // String try.....
7: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: iload_1 //将局部变量区的第2个变量压入栈
11: istore_2 //将栈顶的整数出栈,并存入局部变量区的第3个变量
12: iinc 1, 1
15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
18: ldc #9 // String finally.....
20: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
23: iload_2
24: ireturn
25: astore_3
26: iinc 1, 1
29: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
32: ldc #9 // String finally.....
34: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
37: aload_3
38: athrow
可惜。。。字节码没看懂啊。。。唉。。。留帖,以后再说吧。唉。。
try...catch...finally...return的四角恋的更多相关文章
- try catch finally return之间的关系
一.try catch finally return之间的关系: 正在写dsoFramer的时候,同事突然说面试的时候问的一个问题,catch和return那个先执行,我瞬间迷茫了,然后整理了整理,稍 ...
- 异常 try catch finally return 执行关系 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- try catch finally return运行顺序
首先让我们搞懂两组概念:try catch finally和return 1.try catch finally 首先说try catch, (1)try语句 ,try语句用来包围可能出现异常的代码片 ...
- Java_try,catch,finally return之间的执行顺序
以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例. 掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.f ...
- java try catch finally return执行
public static int testBasic(){ int i = 1; try{ i++; System.out.println("try block, i = "+i ...
- 当try、catch中有return时,finally中的代码会执行么?
今天,看到一个面试题: try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 我们用代码来验证下: public static void mai ...
- java-try catch中return在finally之前 还是之后执行
finally语句在return语句执行之后return返回之前执行的. finally块中的return语句会覆盖try块中的return返回. 如果finally语句中没有return语句覆盖返回 ...
- C#:在catch中return,会执行finally吗?
本文转自 vipxiaotian(CSDN) 请参考下面一段简单的语句块: 1: try2: {3: throw new Exception("new exception&qu ...
- try catch finally return
public override bool Start(IServerConfig config) { bool flag = true; listenSocket = new Socket(Liste ...
随机推荐
- 一个简单的servlet小程序
servlet是不能单独运行的,他是运行在web服务器或应用服务器上的java程序,或者可以说是在servlet容器上运行的,我们经常使用到的tomcat就是一个servlet容器. 他是处理HTTP ...
- Smarty练习增删改
<?php //将题目表显示在页面 include("../init.inc.php"); include("../DBDA.php"); $db = n ...
- 移动端touch事件获取clientX, clientY
目有个交互需要实现手指滑动的交互,pc端使用mousedown,mousemove,mouseup监听实现. 但在ios设备上mousemove是不好监听的,同类的方法是touchstart,touc ...
- NGUI等比缩放
/// <summary> /// UI 等比缩放 /// </summary> static private void AdaptiveUI() { ; ; UIRoot u ...
- SEO优化技巧总结
SEO优化技巧总结 一:了解搜索引擎 基础知识 搜索引擎:由蜘蛛程序沿着链接爬行和抓取网上的大量页面,存进数据库,经过预处理,用户在搜索框 输入关键词后,搜索引擎排序从数据库中挑选出符合搜索关键词要求 ...
- 在cmd模式下对mysql的操作语句
A.window下的语句 1.mysqld -install //安装mysql服务 2.mysqld -remove //卸载mysql服务 3.net start mysql //启动服务 ...
- KNN算法的补充
文本自动分类技术是文字管理的基础.通过快速.准确的文本自动分类,可以节省大量的人力财力:提高工作效率:让用户快速获得所需资源,改善用户体验.本文着重对KNN文本分类算法进行介绍并提出改进方法. 一.相 ...
- php错误记录
1.模板不存在ThinkPHP\Library\Think\View.class.php LINE: 110 是因为IndexController的Index函数,而View中没有对应的Index文件 ...
- c语言_代码段_快说你是猪
/* 项目:快说你是猪 作者:landv 时间:2014年3月12日 编译环境:VS2013 */ #pragma warning(disable:4996) //全部关掉 #pragma warni ...
- c语言-三字符组
C 源程序源字符集在 7 位 ASCII 字符集中包含,但设置为 ISO 646-1983 固定的代码的超集. 三字符序列允许 C 程序编写使用 " 仅 ISO (国际标准组织的固定的代码. ...