Java異常是我們編程中時時刻刻都要使用的特性,但是我們卻很少去關注它細節的一些信 息。
Exception架構
所有的異常都是派生至Throwable,最主要的2個繼承類是Exception和Error。
我們常說的異常都是指Exception,Exception分為Check Exception和Unchecked Exception。
JDK文檔中對Error中解釋是:用於指示合理的應用程序不應該試圖捕獲的嚴重問題,大多 數這樣的錯誤都是異常條件。其中一個比較特殊的就是ThreadDeath,我們不應該去捕獲這個 異常,熟悉多線程編程的朋友一定會清楚其中的原因。
Check Exception和Unchecked Exception
之前在學習C++和C#的時候,所有的異常處理都屬於Unchecked Exception,後來學習Java 發現,Java語言對於某些異常強制要求聲明methods會拋出什麼異常,並且在需要強制捕獲某 些異常,這種異常就屬於Check Exception。
關於什麼時候應該使用Check Exception,什麼時候應該使用Unchecked Exception很多人 都有討論,並沒有一個統一的結論。不過絕大多數的觀點是:混合使用。
使用Exception的常見錯誤
我們看看下面這段代碼:
1:
2: // from http://gpcuster.cnblogs.com
3: InputStream input = null;
4:
5: try{
6:
7: input = new FileInputStream("myFile.txt");
8:
9: //do something with the stream
10:
11: } catch(IOException e){
12: throw new WrapperException(e);
13: } finally {
14: try{
15: input.close();
16: } catch(IOException e){
17: throw new WrapperException(e);
18: }
19: }
如果不存在myFile.txt文件的話,這段代碼最終將會如果執行?
如果仔細考慮這個問題會非常有意思:
首先,在執行input = new FileInputStream(“myFile.txt”)的時候,拋出 FileNotFindException。
然後,進入到catch段,將來拋出WrapperException,但還沒有拋出這個異常。
最後,進入final段,這個時候,input是null的,所以將會拋出NullPointException。
通過這個剪短的分析,我們可以看出,最終的執行結果是拋出NullPointException。
更好地使用異常
如何更加高效地使用異常是一個大家關注的問題,這裡主要有4點建議提供大家參考:
1 對catch住的異常進行包裝和擴展。
2 使用自定義的異常處理接口。
3 在catch異常的最上層記錄異常日志。
4 使用異常處理模板。