【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的在业务上的使用场景其实并不多,此处解释为了方便源码调试时的理解。

 

posted @ 2023-03-06 16:53  马儿跑  阅读(523)  评论(0)    收藏  举报