try-catch-finally小问题

chan10 2009-05-11 12:42:30
看这两个程序的输出结果是什么?(先做下试试,再测试~)

public class Test
{
public static void main(String[] args)
{
System.out.println(tryTest());
}

private static int tryTest()
{
int i = 0;
try
{
i = 1;
return i; //1处
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
}



public class Test
{
public static void main(String[] args)
{
System.out.println(tryTest());
}

private static int tryTest()
{
int i = 0;
try
{
i = 1;
return i+0; //2处
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
}
...全文
542 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyunlong 2009-05-12
  • 打赏
  • 举报
回复
学习了
kimi 2009-05-12
  • 打赏
  • 举报
回复
kimi 2009-05-12
  • 打赏
  • 举报
回复
3
Snake_Jay 2009-05-12
  • 打赏
  • 举报
回复
1. try成功--》finally
2.try出错-->catch-->finally


LZ是想明白执行顺序吧?
那个finally执行了,不过在执行前已经return i值了。
所以。。
chan10 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 zhangpeixv 的回复:]
也可以反编译一下代码,看看
[/Quote]
恩,确实,反编译一下是可以看得清晰点了。
luallen 2009-05-12
  • 打赏
  • 举报
回复
finally 是在 return 前执行了
chan10 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 skfeng36 的回复:]
Think in java 中讲得很清楚。
[/Quote]
哪个地方说的清清楚楚的啊,望指教。
我也在看异常这个章节。
zhangpeixv 2009-05-12
  • 打赏
  • 举报
回复
也可以反编译一下代码,看看
lulikang 2009-05-11
  • 打赏
  • 举报
回复
有什么不正常的???
Ku_wan 2009-05-11
  • 打赏
  • 举报
回复
没有任何异常呀。输出是一样的。
skfeng36 2009-05-11
  • 打赏
  • 举报
回复
Think in java 中讲得很清楚。
rewohs 2009-05-11
  • 打赏
  • 举报
回复
学习了
zzh307924323 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhangpeixv 的回复:]
引用 7 楼 sagegz 的回复:
明显都是1,在return那就返回了.不会再执行finally块了.


仁兄运行了代码没
可以这样加个打印信息再看看执行不

Java code
finally
{
System.out.println("------1------");
i = 3;
System.out.println("------2------");
}
[/Quote]





这位仁兄说的对。。 不错

如果在 finally那位置在加个 return i 那就是3啦
breezes2008 2009-05-11
  • 打赏
  • 举报
回复
16楼程序只是有点点不同,StringBuffer类不同于String类,StringBuffer类的每个对象都是可以扩充和修改的字符串变量。
而在try-catch语句中,无论是否有异常抛出或者使用的return语句,finally块语句都会被执行。
wibnmo 2009-05-11
  • 打赏
  • 举报
回复
大家可以debug下,结果一目了然。
public class Test {
public static void main(String[] args) {
int a = tryTest(); //第1步(此时a=1) 第7步
System.out.println(a); //第8步
}

private static int tryTest() {
int i = 0; //第2步
try {
i = 1; //第3步
return i; //第4步 (执行了finally的i=3;之后再转回执行这句所以这也是 第6步)
} catch (Exception e) {
i = 2;
return i;
} finally {
i = 3; //第5步(此时i=3)
}
}
}

只是大概写了下步骤,再结合18楼的说法,这个题差不多可以解决了。
引用下18楼的:
i是值变量,在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后对 i进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情
如果在finnaly里面也加了return的话,这时候虚拟机栈又会把 i的值copy到return的栈顶。那么你看到的输出就不一样了!!
hello_kitty8888 2009-05-11
  • 打赏
  • 举报
回复
最后的i的值不同,但是返回的值相同,返回的时候这个程序并未执行完。
见丰 2009-05-11
  • 打赏
  • 举报
回复
看StringBuffer的源代码:

public synchronized String toString() {
return new String(value, 0, count);
}
见丰 2009-05-11
  • 打赏
  • 举报
回复
不要吓人,finally里的代码怎么都会执行。
至于16楼的不一样,就好比传String参数和StringBuffer参数的道理一样,引用的值是不变,引用所指的对象已经变了。
chan10 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 wy1222 的回复:]
没有什么不一样的吧!?解释一下到底什么意思?
[/Quote]
是吗,16楼两个的运行结果不一样吧。
waya1222 2009-05-11
  • 打赏
  • 举报
回复
没有什么不一样的吧!?解释一下到底什么意思?
加载更多回复(28)

62,612

社区成员

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

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