try catch finally执行的疑问

jtchan 2011-10-09 07:57:59
public class TestTry {
public static void main(String[] args) {
System.out.println(test());//为什么打印 1
}

private static int test()
{
int i = 1;
try {
return i;
} catch (Exception e) {


}
finally
{
i++;
}
return 0;
}
}
...全文
468 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
carter0851 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ioe_gaoyong 的回复:]

非常简单,因为你定义的test方法 try语句里面执行i=1之后直接就return i这样写就会不执行下面的任何语句,直接退出test方法执行并返回当前的i值,肯定打印输出是1

return语句的作用你体会下
[/Quote]

finally方法应该在return之后执行
ETCentury 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huangchenliang 的回复:]
1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.finally块中的语句是在函数返回前执行的,但函数返回值是在finally块中语句执行前确定的;
4.finally块中不能包含return语句。

楼主可以自己敲下代码验证下、顺便自己理解下。
[/Quote]

finally语句中为什么不能含return语句?这样说是否不是很确切?
finally中含有return语句,会有警告,并且,这个函数的返回值取finally语句中的返回值而已,没有意义罢了。

鄙人愚见
shine333 2011-10-10
  • 打赏
  • 举报
回复
也就是说,函数返回值是当时运行到return这行时候整个return 表达式的结果,也就是当时i的值。
而不是到了return再去执行finally,然后回过头来再去运行return 表达式,求当时(finally以后)表达式的值
shine333 2011-10-10
  • 打赏
  • 举报
回复

// Method descriptor #28 ()I
// Stack: 1, Locals: 4
private static int test();
0 iconst_1 // 常量1
1 istore_0 [i] // 存入寄存器0,即i,以上两行对应 int i = 1
2 iload_0 [i] // 读取寄存器0,即i
3 istore_3 // 存入寄存器3,用以之后的return。以上两行对应return i这里,但是仅仅是finally执行之前的部分
4 iinc 0 1 [i] // 进入finally,对寄存器0,即i,进行+1操作,对应i++
7 iload_3 // 重新进入return代码部分,读取寄存器3,即刚才存放的用以return的值
8 ireturn // return
9 astore_1
10 iinc 0 1 [i]
13 goto 22
16 astore_2
17 iinc 0 1 [i]
20 aload_2
21 athrow
22 iconst_0
23 ireturn
Exception Table:
[pc: 2, pc: 4] -> 9 when : java.lang.Exception
[pc: 2, pc: 4] -> 16 when : any
[pc: 9, pc: 10] -> 16 when : any
Line numbers:
[pc: 0, line: 17]
[pc: 2, line: 19]
[pc: 4, line: 23]
[pc: 7, line: 19]
[pc: 9, line: 20]
[pc: 10, line: 23]
[pc: 16, line: 22]
[pc: 17, line: 23]
[pc: 20, line: 24]
[pc: 22, line: 25]
Local variable table:
[pc: 2, pc: 24] local: i index: 0 type: int
Stack map table: number of frames 3
[pc: 9, full, stack: {java.lang.Exception}, locals: {int}]
[pc: 16, same_locals_1_stack_item, stack: {java.lang.Throwable}]
[pc: 22, same]

另外,不存在finally中的i++不会执行的问题,除非之前有导致jvm崩溃的情况,比如System.exit(0);

public class Test {

static int i = 1;

public static void main(String[] args) throws Exception {
System.out.println(test());
System.out.println(i);
}

private static int test() {

try {
return i;
} catch (Exception e) {

} finally {
i++;
}
return 0;
}
}

打印
1
2
paul-yanlx 2011-10-10
  • 打赏
  • 举报
回复
对。有return.就不会执行后面的语句了。当然打印的是1
hamxyy 2011-10-10
  • 打赏
  • 举报
回复
我受不了了。。。1#真无敌了。。。
你在finally里面对i++,是在ruturn执行之后才做的
并不是finally里的内容不做
但是你return的时候 i是1
但是你整个程序跑完 i是2

记住try catch finally
finally里面的内容是一定会执行的 所以都在这里处理资源的释放
面试用的到哦 楼主分拿来把~
a619225471 2011-10-10
  • 打赏
  • 举报
回复
折腾的生活 2011-10-10
  • 打赏
  • 举报
回复
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时程序转到finally执行
在转去之前,try中先把要返回的结果存放于不同于i的局部变量中,执行完finally之后在从中取出返回结果
因此,finally中对变量i进行的改变,不会影响返回结果!
clementxr 2011-10-10
  • 打赏
  • 举报
回复
这个问题以前也有个帖子问过,try里面有return会先返回值然后再执行finally语句
MT 2011-10-10
  • 打赏
  • 举报
回复
return语句执行了,finally语句始终执行
xflr123 2011-10-10
  • 打赏
  • 举报
回复
return作用 结束方法 返回值
gukuitian 2011-10-10
  • 打赏
  • 举报
回复
luyun2011 2011-10-10
  • 打赏
  • 举报
回复
遇到return语句程序就会退出,不再执行下面的代码,作用类似于break
王二北 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ioe_gaoyong 的回复:]
非常简单,因为你定义的test方法 try语句里面执行i=1之后直接就return i这样写就会不执行下面的任何语句,直接退出test方法执行并返回当前的i值,肯定打印输出是1

return语句的作用你体会下
[/Quote]
1楼回答是错误的,17楼才是正解。我真服了,一群人在哪里说1楼正确。
lcj_up 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huangchenliang 的回复:]
1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.finally块中的语句是在函数返回前执行的,但函数返回值是在finally块中语句执行前确定的;
4.finally块中不能包含return语句。

楼主可以自己敲下代码验证下、顺便自己理解下。
[/Quote]
居然引用错了 无语 上面的很正确
lcj_up 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 stonefeng 的回复:]
嗯,但由于i是声明在方法里面的自动变量,在i++之后就会被丢弃,所以i++实际上浪费了计算资源。还是建议不要这样写了。
[/Quote]
说的很精辟
zkmzge 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 shine333 的回复:]

Java code

// Method descriptor #28 ()I
// Stack: 1, Locals: 4
private static int test();
0 iconst_1 // 常量1
1 istore_0 [i] // 存入寄存器0,即i,以上两行对应 int i = 1
2 iload_0 [i] // 读取寄存……
[/Quote]
菜鸟路过 请教经jvm编译后的.class文件语法
wingson_shen 2011-10-10
  • 打赏
  • 举报
回复
这个问题很有代表性,执行到return时,应该是直接返回1,但是他还是会去执行finally块里的代码,也就是说此时的i==2 那return是应该返回1还是返回2呢,这才是LZ的疑问吧。
liuhuanleijava 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ioe_gaoyong 的回复:]
非常简单,因为你定义的test方法 try语句里面执行i=1之后直接就return i这样写就会不执行下面的任何语句,直接退出test方法执行并返回当前的i值,肯定打印输出是1

return语句的作用你体会下
[/Quote]
正解!
jianyao_84 2011-10-10
  • 打赏
  • 举报
回复
这段代码是先执行i=1;给i赋值1后,i的值存在内存中的,然后finnaly块中i++,这时候打印会是2因为i++了,但是return返回的值还是先前存在内存中的1。
加载更多回复(10)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧