A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唕 中级黑马   /  2014-8-6 23:04  /  2326 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唕 于 2014-8-7 07:49 编辑

try中写了return,后面又写了finally,是先执行return还是先执行finally ?返回值是是怎么回事

22 个回复

倒序浏览
这个题其实我以前的分析过,用断点调试观察后得出的是:
执行顺序它是这样的:
第一种情况:如果return的是一个基本类型
1、当如果在try 中发现  return的时候,直接执行try里的return
2,然后把当前值在栈内存复制一份,这时函数还没return出去就被finally打断了
3、执行finally里的return,如果finally里修改了try中要return那个值,是修改无效的,这时return出去了,但值是try中的return的值

第二种情况:如果try中return的是引用类型,
流程还是一样,如果finally里修改了try中要return那个值,是修改有效的,把修改后的值return出去

有观点不同的继续探讨

点评

犀利  发表于 2014-8-7 07:48

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
本来我想说try。但是你既然这么问了。那我肯定是说 finally!!
回复 使用道具 举报
masai158 发表于 2014-8-6 23:10
本来我想说try。但是你既然这么问了。那我肯定是说 finally!!

是try中的return和finally比较
回复 使用道具 举报
本帖最后由 masai158 于 2014-8-7 00:21 编辑
唕 发表于 2014-8-6 23:13
是try中的return和finally比较

我理解错了。如果 try 和 finally都有return 。 是优先执行 finally 里面的 return。顺序应该是:执行顺序我觉得是这样的:1、当如果在try 中发现  return的时候。2、程序马上跳转到finally。3、如果这个时候finally有return的话。那结果可想而知是返回 finally的。如果没有。4、如果finally执行完毕没有返回语句的话。5、将返回执行 try中的return


回复 使用道具 举报
哈哈, 其实我知道,但是不告诉你。。
回复 使用道具 举报
当遇到return时,会去找下面有没有finally。如果有运算finally里面之后return,如果没有直接return,我走42流程呢  你那一期?
回复 使用道具 举报
杨庆雷 发表于 2014-8-6 23:43
当遇到return时,会去找下面有没有finally。如果有运算finally里面之后return,如果没有直接return,我走42 ...

会先提交return,再走完finally,你试试在finally中改变return返回的的值,看能不能改变……
回复 使用道具 举报
先执行return 然后finally
回复 使用道具 举报
fxwb2005 发表于 2014-8-6 23:51
会先提交return,再走完finally,你试试在finally中改变return返回的的值,看能不能改变…… ...

我以为是在catch里面return呢  在try里面是会先提交return,再走finally
回复 使用道具 举报
我理解错了。如果 try 和 finally都有return 。 是优先执行 finally 里面的 return。
顺序应该是:执行顺序我觉得是这样的:1、当如果在try 中发现  return的时候。2、程序马上跳转到finally。3、如果这个时候finally有return的话。那结果可想而知是返回 finally的。如果没有。4、如果finally执行完毕没有返回语句的话。5、将返回执行 try中的return
回复 使用道具 举报
这我之前的帖子  我发过具体的原因  
回复 使用道具 举报
.Mч┞尛__洋 发表于 2014-8-7 11:59
这我之前的帖子  我发过具体的原因

"一会我考试,下午给你详细分析原因."------------没有说
回复 使用道具 举报
先执行finally,在回去return
回复 使用道具 举报
先执行finally再执行return
回复 使用道具 举报
裤裆里的温柔、 发表于 2014-8-7 01:08
这个题其实我以前的分析过,用断点调试观察后得出的是:
执行顺序它是这样的:
第一种情况:如果return的是 ...

基于Java8 测试,对于返回值(int or double),如果try 和finally块里都有return的话,还是以finally的返回值为结果。

然后把当前值在栈内存复制一份,这时函数还没return出去就被finally打断了  --  这一点是怎么判断的呢?
既然是返回,肯定是要结束函数的。所以我觉得情形应该是:
执行return时,先在特定地方存放要返回的结果;然后执行finally语句段之后再返回。但是执行finally语句段的时候,又出现了return语句,所以重新存放要返回的结果,然后查看finally语句块是否是在另一个try块里,如果是,执行该try块对应的finally语句段(假定有的话),如此类推;如果不是,则作为返回值。
回复 使用道具 举报
裤裆里的温柔、 发表于 2014-8-7 01:08
这个题其实我以前的分析过,用断点调试观察后得出的是:
执行顺序它是这样的:
第一种情况:如果return的是 ...

支持,分析很详细易懂
回复 使用道具 举报
在try中碰到return就执行finally ,然后才 return
回复 使用道具 举报
public static void main(String[] args) {
  System.out.println(new Test5().test());
}
int test() {
  int x = 1;
  try {
   x = 10;
   
   return x;
  } finally {
   x = 20;
   //执行finally会打印finally
   System.out.println("finally");
  }
}
}
/*结果是 finally  10。
*分析: *这个代码之所以返回的是10,不是20,是因为当执行return语句的时候有一个返回路径,
        *return是用来结束方法的,在他要结束之前他会判断有没有finally,但是他的返回路径已经建立好了,
*结论:      *先执行finally但是不会改变他返回路径的值.

这是基本类型,当try 中是引用数据类型,finally中的操作是可以改变返回路径的值,但是还是要执行finally 再return!
*/
回复 使用道具 举报
毕业生 发表于 2014-8-7 23:57
public static void main(String[] args) {
  System.out.println(new Test5().test());
}

好像分析的是对的  结论是有问题的  
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马