???? 下面這個(gè)可憐的小程序并不能干脆的做決定。它的decisive方法將返回true。但是它也返回false。那么,它到底打印的是什么呢?甚至,合法嗎?
class Indecisive
{
?public static void main(String[] args)
?{
??System.out.println(decisive());
?}
?static boolean decisive()
?{
??try
??{
???return true;
??}
??finally
??{
???return false;
??}
?}
}
???你可能認(rèn)為這個(gè)程序不合法。畢竟,decisive方法不能同時(shí)返回true和false。如果你嘗試一下,就會(huì)發(fā)現(xiàn)它
編譯時(shí)沒(méi)有任何錯(cuò)誤,并且它打印的是false。為什么呢?
??? 原因在于就是在:在一個(gè)try-finally語(yǔ)句中,finally語(yǔ)句塊總是在控制權(quán)離開(kāi)try語(yǔ)句塊時(shí)執(zhí)行。無(wú)論try
語(yǔ)句塊是正常結(jié)束的,還是意外結(jié)束,情況都是如此。在一條語(yǔ)句或一個(gè)語(yǔ)句塊拋出一個(gè)異常,或者對(duì)某個(gè)封閉類(lèi)型語(yǔ)句執(zhí)行了一個(gè)break或continue,或是像這個(gè)程序一樣執(zhí)行了一個(gè)return時(shí),將發(fā)生意外結(jié)束。之所以稱(chēng)為意外結(jié)束,是因?yàn)樗鼈冏柚钩绦虬错樞驁?zhí)行下面的語(yǔ)句。
??? 當(dāng)try語(yǔ)句塊和finally語(yǔ)句塊都意外結(jié)束時(shí),在try語(yǔ)句塊中引發(fā)意外結(jié)束的原因?qū)⒈粊G棄,而整個(gè)try-finally
語(yǔ)句意外結(jié)束的原因?qū)⑴cfinally語(yǔ)句塊意外結(jié)束的原因相同。在這個(gè)程序中,在try語(yǔ)句塊中的return語(yǔ)句所
引發(fā)的意外結(jié)束將被丟棄,而try-finally語(yǔ)句意外結(jié)束是由finally語(yǔ)句塊中的return造成的。簡(jiǎn)單的講,程序
嘗試著(try)返回(return)true,但是它最終(finally)返回(return)的是false。
??? 總之,每一個(gè)finally語(yǔ)句塊都應(yīng)該正常結(jié)束,除非拋出不受檢查的異常。千萬(wàn)不要用return,break,continue或throw來(lái)退出finally語(yǔ)句塊,并且千萬(wàn)不要允許讓受檢查的異常傳播到finally語(yǔ)句塊之外。