|
周末了,有時(shí)間更新一下。周末好象也沒(méi)什么特別,除了多睡點(diǎn)和看看書(shū)之外,無(wú)事可做,可憐的單身生涯。 異常,復(fù)雜的話題了。 一。首先看看下面這個(gè)例子,到底返回true還是false呢?還是根本編譯不通過(guò): public class Indecisive { static boolean decision() { 答
案是false,finaly語(yǔ)句塊總是在程序控制權(quán)從try塊離開(kāi)時(shí)開(kāi)始執(zhí)行,無(wú)論try語(yǔ)句塊中是以正常方式或者意外行為結(jié)束。當(dāng)try塊與
finaly塊都以意外方式結(jié)束,整個(gè)try..finaly的意外結(jié)束的原因?qū)⑴cfinaly語(yǔ)句塊意外結(jié)束的原因相同,即try塊意外結(jié)束的原因?qū)⒈?
拋棄。對(duì)于finaly的使用,需要記?。?/p>
每一個(gè)finaly語(yǔ)句塊都應(yīng)該被正常結(jié)束,除非拋出非受控異常。在finaly語(yǔ)句塊中不應(yīng)該使用break,continue,return或者throw來(lái)退出,不應(yīng)當(dāng)讓受控異常傳播到finaly之外。 等等,我們?cè)賮?lái)看個(gè)例子,下面的finaly塊會(huì)被執(zhí)行嗎?? public class HelloGoodbye { 很 抱歉,它只打印:Hello World,finaly語(yǔ)句并沒(méi)有被執(zhí)行,這是為何?這是因?yàn)镾ystem.exit方法將立刻終止當(dāng)前程序的所有線程,使得finaly塊根本沒(méi)機(jī)會(huì) 被調(diào)用。System.exit執(zhí)行兩步操作,首先就是停止當(dāng)前所有線程,其次就是在關(guān)閉VM之前執(zhí)行Shut down Hook(關(guān)閉掛鉤)。如果我們希望在VM關(guān)閉之前執(zhí)行一些操作,這些操作應(yīng)該在Runtime.addShutDownHook上注冊(cè),因此,上面的程 序可以修改為: public class HelloGoodbye {
二。來(lái)看看一些不可思議的程序。 第一個(gè)程序: import java.io.IOException; public class Arcane1 { 試著編譯下,sorry,不能通過(guò)。報(bào)錯(cuò): 在相應(yīng)的try語(yǔ)句主體中不能拋出異常java.io.IOException 錯(cuò)誤信息已經(jīng)很明顯地告訴我們?cè)蛄?,System.out.println方法并不能拋出受控異常IOException。這在JAVA語(yǔ)言規(guī)范中已經(jīng)有描述,如果catch所捕捉的受控異常在try塊里并不能被拋出,這將是一個(gè)編譯期錯(cuò)誤! 第2個(gè)程序: public class Arcane2 { 編譯竟然通過(guò)了,這不是跟我們第一個(gè)程序得到的結(jié)論有矛盾??這又是因?yàn)镴AVA語(yǔ)言規(guī)范所決定的,捕獲Exception或者Throwable的catch語(yǔ)句都是合法,不管他們的try塊語(yǔ)句的內(nèi)容是什么。特例,特例^_^ 第3個(gè)程序,有點(diǎn)長(zhǎng)了,首先定義3個(gè)接口: interface Type1 { interface Type2 { interface Type3 extends Type1, Type2 { 接口Type3繼承Type1,Type2(JAVA中接口是可以多重繼承的),Type1,Type2的f()方法各拋出一個(gè)受控異常。接著看: public class Arcane3 implements Type3 { public static void main(String[] args) { 編 譯通過(guò),打印Hello World!可是我明明聲明了兩個(gè)受控異常啊,怎么實(shí)現(xiàn)類(lèi)都不用處理了??不是要放在一個(gè)try..catch塊里面才行??原因就在于一個(gè)方法可以拋出 的受控異常的集合是它所適用所有類(lèi)型(即父類(lèi)型,此例中的Type1,Type2)聲明要拋出的受控異常的交集,而不是并集!
三。初始化與異常。構(gòu)造函數(shù)必須聲明其實(shí)例初始化操作中會(huì)拋出的所有受控異常。類(lèi)中值域的初始化操作是在調(diào)用構(gòu)造函數(shù)之前發(fā)生的。不要濫用異常,比如使用異常去控制循環(huán),應(yīng)該只為異常條件而使用異常。 四。刪除類(lèi),書(shū)中的謎題44,我不能完全理解,待續(xù),如有朋友有好的見(jiàn)解,最好共享下。 五。以一個(gè)看似會(huì)無(wú)限循環(huán)的遞歸程序結(jié)尾,其實(shí)因?yàn)镴VM的棧的深度有限,此程序總會(huì)終結(jié),可時(shí)間恐怕要在你我骨灰已經(jīng)歷N個(gè)物質(zhì)循環(huán)之后: public class Workout { private static void workHard() { Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=726869 |
|
|
來(lái)自: ShangShujie > 《java》