【Java】先return还是先finally
之前调试只发现有的方法执行完return语句后再执行finally,但是没有细究。
最近debug代码的时候发现,方法有无返回值,竟然会影响return和finally执行顺序。
先看返回类型为void的执行顺序:

继续执行:

继续:

执行顺序是:
try中代码 -> finally代码 -> try中的return
即先执行finally代码块,再执行return行。
再看返回类型为int类型的执行顺序:

继续执行:

发现竟然直接到了return,继续:

以上,执行顺序为:
try中代码 -> try中return -> finally
即先执行return行,再执行finally代码块
而且此方法返回值依然为1,x=100会执行,但不会返回
原因:
void方法的return就是返回,return是方法的最后一步,所以先执行finally代码块,再执行return行。
而有返回值的方法,return行实际是将返回值赋值给一个【匿名变量】,然后再执行finally代码块,并在最后返回前加载【匿名变量】到栈顶,然后执行返回,所以debug执行testx时,执行到return行并不是直接返回,只是把x的值赋给了一个【匿名变量】
补充:
JDK 1.7之后提供了try with resource的方式,会在代码块执行完毕后执行Closeable的close方法,释放资源。
所以finally的在业务上的使用场景其实并不多,此处解释为了方便源码调试时的理解。

浙公网安备 33010602011771号