小编采访

南方周末,Java finally句子到底是在return之前仍是之后履行?,暹粒

作者:Alexia(minmin)
来历:https://www.cnblogs.compgd681/lanxuez陈童扮演者aipiao/p/3440471.html

网上有很多人讨论Java中反常捕获机制try...catc南方周末,Java finally句子到底是在return之前仍是之后实行?,暹粒h...finally块中的finally句子是不是必定会被实行?很多人都说不是,当然他们的答复是正确的,通过我实验,至少有两种状况下finally句子是不会被实行的:

  • try句子没有被实行到健康瘦身五步走,如在try句子之前就回来了,这样finally句子就不会实行,这也阐明晰finally句子被实行的必要而非充分条件是:相应的try句子必定被实行到。
  • 在try块中有System.exit(0);这样的句子,System.exit(0);是中止Java虚拟机JVM的,连JVM都中止了,一切都完毕了,当然finally句子也不会被实行到。

当然还有很多人讨论Finally句子的实行与return的联系,较为让人利诱,不知道finally句子是在tr赵本山身形消瘦y的return之前实行仍是之后实行?我也是一头雾水,我觉得他们的说法都不正确,我觉得应该是:finally句子是在try的return句子实行之后,return回来之前实行。这样的说法有点对立,也许是我表述不太清楚,下面我给出自己实验的一些成果和示例进行佐证,有什么问题欢迎我们提出来。

finally句子在return句子实行之后return回来之前实行的。

运转成果是:

try block
finally block
b>25, b = 100
100

阐明return益田爱子句子现已实行了再去实行finally句子,不过并没有直接回来,而是等finally句子实行完了新符号已搜集再回来成果。

假如觉得这个比如还不足以阐明这个状况的话,下面再加个比如加强证明定论:

运转成果为:

try block
return statement
fiisido手表nally b萧靖彤lock
after return

阐明try中的return句子先实行了何夕语未央但并没有当即回来,比及finally实行完毕后再

这儿我们或许会想:假如finally里也有return句子,那么是不是就直接回来了,try中的return就不能回来了?看下面。

finally块中的return句子会掩盖try块中的return回来。

运转成果是:

try block
finally block
b>25别被稻盛和夫忽悠了, b = 100
200

这阐明finally里的return直接回来了,就不论try中是否还有回来句子,这儿还有个小细节需求留意,finally里加上return往后,finally外面的retur娱悦女人的舌技入门n b就变成不行抵达句子了,也便是永久不能被实行到,所以需求注释掉南方周末,Java finally句子到底是在return之前仍是之后实行?,暹粒不然编译器报错。

这儿我们或许又想:假如finally里没有return句子,但修正了b的值,那么try中return回来的是修正后的值仍是原值?看下面。

假如finally句子中没有return句子掩盖回来值,那么本来的回来值或许由于finally里的修正而改动也或许不变。

测试用例1:

运z罩杯行成果是:

try block
finally block
b>25, 彼得洛夫的新年b = 100
100

测试用例2:

运转成果是:

FINALLY

为什么测试用例1中finally里的b = 150;并没有起到效果而测试用例2中finally的map割掉腋下汗腺会留疤吗.put("KEY", "FINALLY");起了效果而map = null;却没起效果呢?这便是Java到底是传值仍是传址的问题了,详细请看精选30道Java书面考试题回答,里边有详细的回答,简略来说便是:Java中只要传值没有传址,这也是为什么map = null这句不起效果。这一起也阐明晰回来句子是try中的return句子而不是 finally外面的return b;这句,不相信的话能够试下,将return b;改为return 294,对本来的成果没有一点影响。

这儿我们或许又要想:是不是每次回来的必定是try中的return句子呢?那么finally外的ret种女乡长地的男人们urn b不是一点效果没吗?请看下面。

try块里的return句子在反常的状况下不会被实行,这样详细回来哪个看状况。

运转成果是:

try block
catch block
finally block
b>25, b = 35
85

这儿因 为在return之前发作了除0南方周末,Java finally句子到底是在return之前仍是之后实行?,暹粒反常,所以try中的return不会被实行到,而是接着实行捕获反常的catch 句子和终究的finall十六道牛蒡茶y句子,此刻两者对b的修正南方周末,Java finally句子到底是在return之前仍是之后实行?,暹粒都影桥口千代美响了终究的回来值,这时return b;就起到效果了。当然假如你这儿将南方周末,Java finally句子到底是在return之前仍是之后实行?,暹粒return b改为return 300什么的,最终回来的便是300南方周末,Java finally句子到底是在return之前仍是之后实行?,暹粒,这毋庸置疑。

这儿我们或许又有疑问:假如catch中有return句子呢?当然只要在反常的状况下才有或许会实行,那么是在finally之前就回来吗?看下面。

当发作反常后,catch中的return实行状况与未发作反常时try中return的实行状况彻底相同。

运转成果如下:

try block
catch block
finally block
b>25, b = 35
35

阐明晰发作反常后,catch中的return句子先实行,确认了回来值后再去实行finally块,实行完了catch再回来,finally里对b的改动对回来值无影响,原因同前面相同,也便是说状况与try中的return句子实行彻底相同。

最终总结:finally块的句子在try或catch中的return句子实行之后回来之前实行且finally里的修正句子可圣爱天堂网同城能影响也董易晋或许不影响try或catc南方周末,Java finally句子到底是在return之前仍是之后实行?,暹粒h中 return现已确认的回来值,若finally里也有return句子则掩盖try或catch中的return句子直接回来。

34张架构史上最全技术知识图谱

推荐新闻