try-catch-finally返回值的问题

stomach 2012-07-30 06:17:03
程序代码如下

public class TryCatchFinally {
public static int work() {
int result = 0;
try {
System.out.println("try block");
result++;
return result;
} catch (Exception e) {
System.err.println("catch block");
return result;
} finally{
System.out.println("finally block");
result++;
System.out.println("result = "+result);
}

}

public static void main(String[] args) {
System.out.println("result = "+work());
}

}


finally块的代码会在try块的return语句之前执行,所以分析来看输出应该是
try block
finally block
result = 2
result = 2

但是实际运行的输出结果却是
try block
finally block
result = 2
result = 1

把result改成类的全局变量还是这样的输出结果,是return的时候出现的问题吗?
...全文
358 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
rain408806 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
如果你返回的是个引用类型,而在finally中修改该引用中的某个属性值的话,会导致返回对象也被相应修改。但是你要返回的是基本数据类型的话,就不会出现变化了。

Java code

public class TryCatchFinally {
public static Person work() {
Person result = new Person();
……
[/Quote]
好像finally少了 return,不过结果还是一样的
VanBaston 2012-07-31
  • 打赏
  • 举报
回复
如果你返回的是个引用类型,而在finally中修改该引用中的某个属性值的话,会导致返回对象也被相应修改。但是你要返回的是基本数据类型的话,就不会出现变化了。

public class TryCatchFinally {
public static Person work() {
Person result = new Person();
try {
System.out.println("try block");
result.setName("name");
return result;
} catch (Exception e) {
System.err.println("catch block");
return result;
} finally{
System.out.println("finally block");
result.setName("name1");
System.out.println("result = "+result.getName());
}

}

public static void main(String[] args) {
System.out.println("result = "+work().getName());
}
}

class Person {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
sl_nevergiveup 2012-07-31
  • 打赏
  • 举报
回复
由于你catch里面有一个return,所以当finally里面的代码执行的时候,main函数里的println方法的参数就已经确定为catch返回时的值了
shenhua 2012-07-31
  • 打赏
  • 举报
回复
这是必须的嘛:finally里面还有++,自然result=2;
而你在catch里面就已经return了,此时的result=1;
自然main方法调用放回的result=1。你哪里看错了吧。
五哥 2012-07-31
  • 打赏
  • 举报
回复
月经贴又来啦...
sffx123 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

http://topic.csdn.net/u/20120607/07/9d3a5948-ca38-4eb9-a4f8-63400b34e13a.html
[/Quote]+1
Crazy_4J 2012-07-31
  • 打赏
  • 举报
回复
9楼正解....
Zongjianchang 2012-07-31
  • 打赏
  • 举报
回复
我想知道如果将return result也加到finally最后,会输出什么?还会是1吗?
wwwcomcn123 2012-07-30
  • 打赏
  • 举报
回复
刚执行了一下代码
看了一下执行的顺序

try
try block

finally
finally block
result = 2

再执行了try里的return
finally里改变返回值变量并不影响返回值本身
result = 1

结果就是
try block
finally block
result = 2
result = 1
qybao 2012-07-30
  • 打赏
  • 举报
回复
引用类型返回引用(也就是对象的地址),String比较特殊(包括基本类型的封装类型),因为没法修改它们的属性,所以return的只会是finally修改之前的引用(也就是说你在finally对引用变量做任何操作没有任何影响)


stomach 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

return 的时候把返回值压栈,然后继续执行finally的代码,执行结束以后把返回值出栈,再把返回值返回去
[/Quote]
对于引用类型,比如String,return执行的时候是返回引用变量,还是引用变量指向的具体内容?
wangdong20 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

return 的时候把返回值压栈,然后继续执行finally的代码,执行结束以后把返回值出栈,再把返回值返回去
[/Quote]
小弟也不明白为什么结果会是
try block
finally block
result = 2
result = 1
为什么System.out.println("result = "+result);执行了两次,而且结果不一样
求大侠指点

qybao 2012-07-30
  • 打赏
  • 举报
回复
return 的时候把返回值压栈,然后继续执行finally的代码,执行结束以后把返回值出栈,再把返回值返回去

62,634

社区成员

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

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