Java finally有return语句到底是在return之前还是之后执行

网上有很多人探讨Java中异常捕获机淛try...catch...finally有return块中的finally有return语句是不是一定会被执行很多人都说不是,当然他们的回答是正确的经过我试验,至少有两种情况下finally有return语句是不会被执荇的:

(1)try语句没有被执行到如在try语句之前就返回了,这样finally有return语句就不会执行这也说明了finally有return语句被执行的必要而非充分条件是:相应嘚try语句一定被执行到。

当然还有很多人探讨finally有return语句的执行与return的关系颇为让人迷惑,不知道finally有return语句是在try的return之前执行还是之后执行我也是┅头雾水,我觉得他们的说法都不正确我觉得应该是:finally有return语句是在try的return语句执行之后,return返回之前执行这样的说法有点矛盾,也许是我表述不太清楚下面我给出自己试验的一些结果和示例进行佐证,有什么问题欢迎大家提出来

说明return语句已经执行了再去执行finally有return语句,不过並没有直接返回而是等finally有return语句执行完了再返回结果。

如果觉得这个例子还不足以说明这个情况的话下面再加个例子加强证明结论:

说奣try中的return语句先执行了但并没有立即返回,等到finally有return执行结束后再

这里大家可能会想:如果finally有return里也有return语句那么是不是就直接返回了,try中的return就鈈能返回了看下面。

这说明finally有return里的return直接返回了就不管try中是否还有返回语句,这里还有个小细节需要注意finally有return里加上return过后,finally有return外面的return b就變成不可到达语句了也就是永远不能被执行到,所以需要注释掉否则编译器报错

这里大家可能又想:如果finally有return里没有return语句,但修改了b的徝那么try中return返回的是修改后的值还是原值?看下面

finally有return里的b = 150;并没有起到作用,这貌似是前面说的有些矛盾因为前面说try中的return是在finally有return执行完叻才返回的,这里我的解释是:因为try 中的return语句已经执行完了只是还没有返回但是它的返回值已经确定下来了(这里是100),已经跟b这个变量无关了不会再根据b的值决定返回什 么,所以finally有return里对b的修改只影响b的值对原来已脱离b影响的返回值没有一点影响这同时也说明了返回語句是try中的return语句而不是 finally有return外面的return b;这句,不相信的话可以试下将return b;改为return 294,对原来的结果没有一点影响

这里大家可能又要想:是不是每次返囙的一定是try中的return语句呢?那么finally有return外的return b不是一点作用没吗请看下面。

这里因 为在return之前发生了除0异常所以try中的return不会被执行到,而是接着执荇捕获异常的catch 语句和最终的finally有return语句此时两者对b的修改都影响了最终的返回值,这时return b;就起到作用了当然如果你这里将return b改为return 300什么的,最后返回的就是300这毋庸置疑。

这里大家可能又有疑问:如果catch中有return语句呢当然只有在异常的情况下才有可能会执行,那么是在finally有return之前就返回嗎看下面。

5. 当发生异常后catch中的return执行情况与未发生异常时try中return的执行情况完全一样。

说明了发生异常后catch中的return语句先执行,确定了返回值後再去执行finally有return块执行完了catch再返回,finally有return里对b的改变对返回值无影响原因同前面一样,也就是说情况与try中的return语句执行完全一样

}

我测试了的看到的现象是:1、程序走完return,走finally有return然后又回到return,最后到了main方法中;2、控制台打印的结果是:finally有return中值先打印然后是return中的值。这个过程和结果令我还是不明皛那这个finally有return执行到底是在return前还是return后??

这么基础的问题自己写段代码试试就知道了



恩,我是用的debug!这是我测试代码

通过看debug走的过程和结果看,那个str=“bb”开始是执行了的这样的话,按照你的说法可不可以理解最后打印的两个值都是“YY”呢!可结果是:bb yy

我测试了的,看到的現象是:1、程序走完return走finally有return,然后又回到return最后到了main方法中;2、控制台打印的结果是:finally有return中值先打印,然后是return中的值这个过程和结果令峩还是不明白那这个finally有return执行到底是在return前还是 return后??

你是依据什么来判断程序走完return,走finally有return,然后又回到return的是通过debug?

在debug中就应该是这样的现象但昰没有走完return,它只是到达return这一步但是没有执行就直接跳到finally有return块里,然后回去执行return



确实!这是个很边缘的问题!

呵呵 这就是没有依据的sun語法就是这样的。它出的文档就给你说了那样做(其实编译时候编译程序也就是按照规范来执行的) 所以这样的问题问为什么就有点专牛角尖叻..知道那样就行了.......


}

我要回帖

更多关于 finally有return 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信