?一个try catch 中的return 问题

fanzhijun301 2009-03-05 08:13:03
加精
package com;

public class TestTryCatch {

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

public static int kkk(){
int k = 0;
try {
k += 2;
return k;
} catch(Exception e){
k++;
return k;
} finally {
k += 5;
}
}
}

大家说这个程序的结果会输出什么?开始我认为输出为7,可是实际输出为2,但是经过调试,在程序返回前是要经过k += 5 这段代码的,并且通过观察点k的值是7,但是真正的输出却是2,这是为什么?
...全文
2417 106 打赏 收藏 转发到动态 举报
写回复
用AI写文章
106 条回复
切换为时间正序
请发表友善的回复…
发表回复
superliandi 2012-06-01
  • 打赏
  • 举报
回复
你都已经return了,再加都是一样
Srain 2012-05-26
  • 打赏
  • 举报
回复
K+5并未return回main函数啊,它的作用域应该只在finally块中,建议楼主多看看变量的作用域问题,前些天我也在调试中发现,在try块中的定义的变量,其作用域只在块内。
  • 打赏
  • 举报
回复
在try里有return,finally还是会执行的,不过是在return之后执行的
world_fucker 2011-12-29
  • 打赏
  • 举报
回复
“通过看大家的讨论,我似乎明白点了,我们可以把try-catch-finally三块看成一个流水线,分别对同一个资源进行加工。如果中间的某一步(try-catch)遇到return就会冻结这块的执行结果等待返回,至于finally块只是继续前面结果执行做其他操作,不再影响返回前面模块的执行结果,如果这一块代码中有return那么就以这一块的执行结果返回。”

其实,楼主的总结在意思上是说对了,只是没有说到本质上。 给个链接地址:http://www.ibm.com/developerworks/cn/java/j-lo-finally/
这里有一篇文章,在本质上非常详细地阐释了这个问题(当然文章中还有其它关于finally语句的知识,很有学习价值),关于楼主的问题的解释,可以从原文的后半部分内容:“好了,看到这里,是不是有人认为自己已经掌握了 finally 的用法了?先别忙着下结论,我们再来看两个例子 – 清单 5 和清单 6。
清单 5.
public class Test {
public static void main(String[] args) {
System.out.println("return value of getValue(): " + getValue());
}

public static int getValue() {
try {
return 0;
} finally {
return 1;
}
}
}

清单 5 的执行结果:
return value of getValue(): 1

”这一段往后面看。此人从java虚拟机的工作原理上来解释的,绝对给力。
w2gavin 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yangfeitarena 的回复:]
我理解楼主的想法,你是考虑的k值返回之前在内存中已经变成7了,所以你坚持说应该是7。那我告诉你,方法在return的时候并不是把它所拥有的那个值给返回了,而是复制一份返回!因此,对于基本类型的数据,在finally中改变return的值对返回值没有任何影响,而对于引用类型的数据,就有影响。
[/Quote]

String不是基本类型,同样适用~
blog.pytool.com 2010-04-10
  • 打赏
  • 举报
回复
学习了
try catch finally
zy2419 2010-04-09
  • 打赏
  • 举报
回复
不明白啊,是引用的时候为什么list.add("aa");返回的时候把aa带上了,当list=null;就没起作用?
yunxiangxuehai 2010-03-23
  • 打赏
  • 举报
回复
讨论一年了,还不结贴啊
hww6891 2010-03-21
  • 打赏
  • 举报
回复
学习中,受教了
hx_centit 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 longling520 的回复:]
引用楼主 fanzhijun301 的帖子:
package com;

public class TestTryCatch {

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

public static int kkk(){
int k = 0;
try {
k += 2;
r……
[/Quote]
金融砖家 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 yang677888 的回复:]
try/catch/finally语句下,finally子句是肯定会执行的。但是很多人做不同的测试,却得出了不同的结论。

具体的原理最好是去看《深入java虚拟机》,里面对jsr、ret等几个指令做了详细的说明。这里不深入分析,而仅仅是从表现形式上看一下finally的特征。

代码:


/*

* author: Zang XT

*/

public class TestFinal {

public static void main(String[] args) {

System.out.println("…
[/Quote]
金融砖家 2009-06-29
  • 打赏
  • 举报
回复
这么多人 回答不知道那个是正确的答案了 来个厉害的总结下啊 感觉你问东西有问题 ,, 正常的思维是我们一开始应该觉得是答案是2 ;按照程序的流程走 到return 返回 但finalliy 还要执行 这个大家都清楚。。 然后调试的时候 发现 在return 之前居然K得值变成7了 怎么你倒相反呢 ???
金融砖家 2009-06-29
  • 打赏
  • 举报
回复
这个问题真复杂 完全理解还要理解压入栈 看来我们大部分只是看了个表象啊
zjwilove4 2009-06-29
  • 打赏
  • 举报
回复
个人感觉是值类型和引用类型的区别,以及try catch(异常特征)的特性导致的这个问题
fatmind 2009-06-28
  • 打赏
  • 举报
回复
try {
....
} ctach {
....
} finally {
....
}


1.finally块肯定要执行
2.return 返回点的选择

楼上很多人说的已经很清楚了,说下自己的看法,不知道大家注意到没有 :

try {
int i = 0;
} ctach {
// System.out.println(i); 错误
}

我想表达的意思这是一个“数据堆栈区域的问题”,try ,catch ,finally 分别开辟的是独立的存储区域。
这样在finally对变量的操作相当是"函数的传参" 。。。这又回归到java的基础,"值传递"的问题,结合return返回点的选择,这样的话是能够很好的解释以上大家遇到的问题。


不知道自己的想法对不?还希望指点!谢谢
xcj0722 2009-06-28
  • 打赏
  • 举报
回复
顶!!
makeawish009 2009-06-28
  • 打赏
  • 举报
回复
你的那个k+=2后直接就return了
所以往下就不走了
  • 打赏
  • 举报
回复
反正就是你没跳出了
jms20030108 2009-06-28
  • 打赏
  • 举报
回复
我不是专业的,但这个问题明显是lz对程序设计的理解问题,这么简单的问题可以看出中国人的软件水平
magicxin031 2009-06-28
  • 打赏
  • 举报
回复
up一下
加载更多回复(83)

62,616

社区成员

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

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