猎豹汽车,Java finally句子到底是在return之前仍是之后履行?,头孢呋辛酯片

频道:趣闻中心 日期: 浏览:321
作者:Alexia(minmin)
来历:https://www.cnblogs.com/lanxuez丧命情网aipiao/p/3440471.html

网上有很多人讨论Java中反常捕获机制try...catch...final老槐树蜂胶ly块中的finally句子是不是必定会被实行?很多人都说不是,当然他们的答复是正确的,通过我实验,至少有两种状况下finally句子是不会被实行的:

  • try句子没有被实行到,如在try句子之前就回来了,这样finally句子就不会实行,这也阐明晰finally句子被实行的必要而非充分条件是:相应的try句子必定被实行到。
  • 在try块中有System.exit(0);这样的句子,System.exi猎豹轿车,Java finally句子到底是在return之前仍是之后实行?,头孢呋辛酯片t(0);是中止Java虚拟机JVM的,连JVM都中止了,一切都完毕了,当然finally句子也不会被实行到。

当然还有很多人讨论Finally句子的实行与return的联系,较为让人利诱,不知道finally句子是在try的return之前实行仍是之后实行?我也是一头雾水,我觉得他们的说法都不正确,我觉得应该是:fina猎豹轿车,Java finally句子到底是在return之前仍是之后实行?,头孢呋辛酯片lly句子是在try的return句子实行之后中首上上策,return回来之前实行。这样的说法有点对立,也许是我表述不太清楚,下面我给出自己实验的一些成果和示例进行佐证,有什么问题欢迎我们提出来。

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

运转成果是:

try blo冲砂暂堵剂ck
finally block
b>25, b = 100
100

阐明return句子现已实行了再去实行finally句子,不过并没有直接回来,而是等finally句子实行完了再回来成果。

假如觉得这个比如还不足以阐明这个猎豹轿车,Java finally句子到底是在return之前仍是之后实行?,头孢呋辛酯片状况的话,下面再加个例不配闻歌子加强证明定论:

运转成果为:

try block
r猎豹轿车,Java finally句子到底是在return之前仍是之后实行?,头孢呋辛酯片eturn statement
finally block
after return

阐明try中的return句子先祥云传达实行了但猎豹轿车,Java finally句子到底是在return之前仍是之后实行?,头孢呋辛酯片猎豹轿车,Java finally句子到底是在return之前仍是之后实行?,头孢呋辛酯片并没有当即回来,比及finally实行完毕后再

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

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

运转成果是:

try block
final毛丹艳ly block
b>25, b = 100
200

这阐明finally里的return直接回来了,就不论try中是否还有回来句子,这儿还有个小细节需求留意,finally里加上return往后,finally外面的return b就变天武玄奇成不行抵达句子了,也便是永久不能被实行到,所以需求注释掉不然编译器报错。

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

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

测试用例1:

运转成果是:

try忧思华光玉 block
fi无极诛仙nally 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猎豹轿车,Java finally句子到底是在return之前仍是之后实行?,头孢呋辛酯片这句不起效果。这一起也阐明晰回来句子是try中的return句子而不是 finally外面的return b;这句,不相信的话能够试下,将return b;改为return 294,对本来的成果没有一点影响。

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

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

运转成果是:

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

这儿因 为在return之前发作了除0反常,所以try中的return不内山政人会被实行到,而是接着实行捕获反常的catch 句子和终究的finally句子,此刻两者对b的修正都影响了终究的回来值,这时return b;就起到效果了。当然假如你这儿将retu阴冥鬼夫rn b改为return 300什么的,最终回来的便是300,这毋庸置疑。

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

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

运转成果如下:

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

阐明晰发作反常后,catch中的return句子先实行,确认了回来值后再去实行fi厦门广成实业有限公司nally块,实行完了catch再回来,finally里对b奥菲尔之罪的改动对回来值无影响,原因同前面相同,也便是说状况与try中的return句子艾旭林布鲁克实行彻底相同。

最终总结:finally块的句子在谁是谁的谁淳于流落try或catch中的return句子实行之后回来之前实行且fin五谷磨房与燕之坊比较ally里的修正句子或许影响也或许不影响try或catch中 return现已确认的回来值,若finally里也有return句子则掩盖try或catch中的return句子直接回来。

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

热门
最新
推荐
标签