勿以惡小而為之:Java程式設計的惡魔
1 OutputStreamWriter out = ... 程式碼:15行-18行。 這段程式碼捕獲了異常卻不作任何處理,可以算得上Java程式設計中的殺手。從問題出現的頻繁程度和禍害程度來看,它也許可以和C/C++程式的一個惡名遠播的 問題相提並論——不檢查緩衝區是否已滿。如果你看到了這種丟棄(而不是丟擲)異常的情況,可以百分之九十九地肯定程式碼存在問題(在極少數情況下,這段程式碼 有存在的理由,但最好加上完整的註釋,以免引起別人誤解)。 這段程式碼的錯誤在於,異常(幾乎)總是意味著某些事情不對勁了,或者說至少發生了某些不尋常的事情,我們不應該對程式發出的求救訊號保持沉默和無動於衷。 呼叫一下printStackTrace算不上“處理異常”。不錯,呼叫printStackTrace對除錯程式有幫助,但程式除錯階段結束之後, printStackTrace就不應再在異常處理模組中擔負主要責任了。 那麼,應該怎樣改正呢?主要有四個選擇: 1、處理異常。針對該異常採取一些行動,例如修正問題、提醒某個人或進行其他一些處理,要根據具體的情形確定應該採取的動作。再次說明,呼叫printStackTrace算不上已經“處理好了異常”。 2、重新丟擲異常。處理異常的程式碼在分析異常之後,認為自己不能處理它,重新丟擲異常也不失為一種選擇。 3、把該異常轉換成另一種異常。大多數情況下,這是指把一個低階的異常轉換成應用級的異常(其含義更容易被使用者瞭解的異常)。 4、不要捕獲異常。 結論一:既然捕獲了異常,就要對它進行適當的處理。不要捕獲異常之後又把它丟棄,不予理睬。 反例之二:不指定具體的異常 程式碼:15行。 許多時候人們會被這樣一種“美妙的”想法吸引:用一個catch語句捕獲所有的異常。最常見的情形就是使用catch(Exception ex)語句。但實際上,在絕大多數情況下,這種做法不值得提倡。為什麼呢?
要理解其原因,我們必須回顧一下catch語句的用途。catch語句表示我們預期會出現某種異常,而且希望能夠處理該異常。異常類的作用就是告訴
Java編譯器我們想要處理的是哪一種異常。由於絕大多數異常都直接或間接從java.lang.Exception派生,catch
(Exception ex)就相當於說我們想要處理幾乎所有的異常。 |