try-catch-finally中return语句的执行

catch里return后还会执行finally吗??
在java里,是的。
但是值得注意的是,在存在try-catch-finally的方法中,return可能出现的位置有4个,在try中,在catch中,在finally中,在finally后(try-catch-finally外的语句块)。
在这4个位置都出现return的情况下(事实上应该是不可能的,如果前面3个位置都存在return,那么最后一个位置的return就成了unreachable code,编译不会通过),最终会执行的return应该是finally中的return。也就是finally中的return会覆盖掉其它位置的return。
但当finally中不存在return,而catch中存在return,但finally中的语句又会对catch中的return的值产生影响时,情况就有点复杂。见下面这个例子:

int ret = 0;try{ throw new Exception(); }catch(Exception e){ ret = 1; return ret;}finally{ ret = 2; //return ret;}return ret;  

这里finally中没有return,但是将catch中要return的ret赋值为2.那么最后返回的值是多少?
是1. 为什么?
从调试中可以知道Finally中的赋值语句的确被执行了,而执行完这条finally语句后的下一条语句就是catch中的return,那么为啥返回的是1呢?
查看了一下java language specification 3.0,似乎没有相关情形的描述。
结合网上的一些相关文章,只能得出一个推断就是在这种情况下(catch中有return,finally中没有return),return的值在执行finally之前已经确定下来了。
另一个值得注意的是最后的return(位于try-catch-finally外)并没有被执行。

posted @ 2016-04-09 09:28  技无止境  阅读(492)  评论(0编辑  收藏  举报