黑马程序员技术交流社区

标题: 测试题交流1---你值得拥有 [打印本页]

作者: 唕    时间: 2014-8-6 23:04
标题: 测试题交流1---你值得拥有
本帖最后由 唕 于 2014-8-7 07:49 编辑

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

作者: masai158    时间: 2014-8-6 23:10
本来我想说try。但是你既然这么问了。那我肯定是说 finally!!
作者: 唕    时间: 2014-8-6 23:13
masai158 发表于 2014-8-6 23:10
本来我想说try。但是你既然这么问了。那我肯定是说 finally!!

是try中的return和finally比较
作者: masai158    时间: 2014-8-6 23:17
本帖最后由 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



作者: 回头浪子心    时间: 2014-8-6 23:33
哈哈, 其实我知道,但是不告诉你。。
作者: 杨庆雷    时间: 2014-8-6 23:43
当遇到return时,会去找下面有没有finally。如果有运算finally里面之后return,如果没有直接return,我走42流程呢  你那一期?
作者: fxwb2005    时间: 2014-8-6 23:51
杨庆雷 发表于 2014-8-6 23:43
当遇到return时,会去找下面有没有finally。如果有运算finally里面之后return,如果没有直接return,我走42 ...

会先提交return,再走完finally,你试试在finally中改变return返回的的值,看能不能改变……
作者: conglin1991    时间: 2014-8-6 23:54
先执行return 然后finally
作者: 杨庆雷    时间: 2014-8-7 00:05
fxwb2005 发表于 2014-8-6 23:51
会先提交return,再走完finally,你试试在finally中改变return返回的的值,看能不能改变…… ...

我以为是在catch里面return呢  在try里面是会先提交return,再走finally
作者: masai158    时间: 2014-8-7 00:21
我理解错了。如果 try 和 finally都有return 。 是优先执行 finally 里面的 return。
顺序应该是:执行顺序我觉得是这样的:1、当如果在try 中发现  return的时候。2、程序马上跳转到finally。3、如果这个时候finally有return的话。那结果可想而知是返回 finally的。如果没有。4、如果finally执行完毕没有返回语句的话。5、将返回执行 try中的return

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

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

有观点不同的继续探讨
作者: .Mч┞尛__洋    时间: 2014-8-7 11:59
这我之前的帖子  我发过具体的原因  
作者: 唕    时间: 2014-8-7 12:05
.Mч┞尛__洋 发表于 2014-8-7 11:59
这我之前的帖子  我发过具体的原因

"一会我考试,下午给你详细分析原因."------------没有说
作者: 天黑偷牛    时间: 2014-8-7 16:25
先执行finally,在回去return
作者: 吥洅ㄨ错过ㄩ    时间: 2014-8-7 18:55
先执行finally再执行return

作者: 江苏孙浩    时间: 2014-8-7 19:18
裤裆里的温柔、 发表于 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 21:08
裤裆里的温柔、 发表于 2014-8-7 01:08
这个题其实我以前的分析过,用断点调试观察后得出的是:
执行顺序它是这样的:
第一种情况:如果return的是 ...

支持,分析很详细易懂
作者: 舍我其谁    时间: 2014-8-7 23:17
在try中碰到return就执行finally ,然后才 return
作者: 毕业生    时间: 2014-8-7 23:57
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-8 00:20
毕业生 发表于 2014-8-7 23:57
public static void main(String[] args) {
  System.out.println(new Test5().test());
}

好像分析的是对的  结论是有问题的  
作者: 曾翀    时间: 2014-8-8 15:00
学习了。。。。。
作者: Faith-    时间: 2014-8-8 16:39
怎么说什么的都有啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2