Java中return和finally的执行顺序

Java中return和finally的执行顺序

finally不会执行的情况:

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

2. 在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

return和finally的执行顺序:

1. finally语句在return语句执行之后return返回之前执行的。

2. finally块中的return语句会覆盖try块中的return返回。

3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。

    4. try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况。

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

总结:

finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

try(或者catch)中的return语句的返回值放入线程栈的顶部(说法上可能有问题):如果返回值是基本类型则顶部存放的就是值,如果返回值是引用类型,则顶部存放的是引用。finally中的return语句可以修改引用所对应的对象,无法修改基本类型。但不管是基本类型还是引用类型,都可以被finally返回的具体值覆盖。

不建议在finally中使用return语句,如果有,eclipse会warning“finally block does not complete normally”。原因如下:

        1. finally块中的return语句会覆盖try块、catch块中的return语句。

2. 如果finally块中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常。

参考:
   
   
经验分享 程序员 微信小程序 职场和发展