美文网首页
java finally陷阱

java finally陷阱

作者: John13 | 来源:发表于2018-11-08 10:26 被阅读0次

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

Java中try catch finally语句中含有return语句的执行情况(总结版)

总结:

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?

很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:

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

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

当然还有很多人探讨Finally语句的执行与return的关系,颇为让人迷惑,不知道finally语句是在try的return之前执行还是之后执行?

我也是一头雾水,我觉得他们的说法都不正确,我觉得应该是:
finally语句是在try的return语句执行之后,finally之后的return返回之前执行。

情况分类:

try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:

  • 情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。

  • 情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。

  • 情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况:

1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。

2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

相关文章

网友评论

      本文标题:java finally陷阱

      本文链接:https://www.haomeiwen.com/subject/crbixqtx.html