敏捷是一條很長的路,摸索著前進著
關于try-catch-finally的用法我就不多說了。網上搜一下,資料很多。
這里我想主要討論下在finally塊加入return語句,屏蔽異常的問題。
我們先來看這樣一段代碼,
代碼1:
以上代碼在Eclipse里是不會編譯通過的,因為在catch塊中throw了一個異常,而print方法并沒有聲明要拋出異常。
現在我們修改代碼,讓它能夠通過編譯,代碼2:
就是在print和main方法后加throws Exception,然后運行,看運行結果:
程序先是走到了catch塊的第一句,打印了at catch block step 1.
但并沒有緊接著去throw e,即沒有立刻拋出這個異常,之所以這樣說,是因為異常的信息是在finally塊的打印信息之后才打印的。
這個例子告訴我們,finally不管出現異常與否,都必須去執行的代碼。(如果中途終止了jvm,就不必去執行了)
那么何時執行finally塊中的代碼呢?
在這個例子中,try塊中有異常拋出,所以finally塊中的代碼是在執行了catch語句之后、退出方法之前被執行的(如果這里執行了throw e,則方法就退出了) 。
下面再看另外一個代碼,代碼3:
這段代碼與之前相比,在finally塊中增加了return語句。
雖然在catch塊中有throw e語句,但在print方法后并不用聲明throws Exception,也可以通過編譯。
因為在try塊中有Thread.sleep(1);語句,所以必須要捕獲InterruptedException,但在這種情況下,即使我們把catch塊去掉了,也不會有問題,這是怎么回事呢?
因為在finally塊中的return語句屏蔽了異常。
經過代碼2我們已經知道了,異常在finally塊被執行之前,雖然會執行catch塊中的代碼,但并不會退出方法,在退出方法之前,會轉向finally塊中執行,而在finally塊中又恰好有return語句,所以方法就正常退出了,在try塊中產生的異常就不會有機會被拋出。
----2009年02月13日
Powered by: BlogJava Copyright © 李 明