1、什麼是異常?
程序運行時,發生的不被期望的事件,它阻止了程序按照程序員的預期正常執行,這就是異常。
Java標準庫內建了一些通用的異常,這些類以Throwable爲頂層父類。Throwable派生出Error類和Exception類。
Error:Error類以及它的子類的實例,代表了JVM本身的錯誤。錯誤不能被程序員通過代碼處理,Error很少出現,一旦出現Error程序就掛了,最常見的就是OutOfMemoryError,StackOverFlowError,UnknownError。
Exception:Exception以及它的子類,代表程序運行時發生的各種不期望發生的事件。可以被Java異常處理機制使用,是異常處理的核心。
異常也可以分爲兩類:非檢查異常,檢查異常。
非檢查異常:Error和RuntimeException以及它們的子類。Javac在編譯時,不會提示和發現這樣的異常,不要求程序處理這些異常。如:ArithmeticException,ClassCastException,ArrayIndexException,NullPointException。
檢查異常:除了Error和RuntimeException的其他異常。javac強制要求程序員爲這樣的異常做預備處理工作(使用try...catch...finally或者throws)。如:SQLException,IOException,ClassNotFoundException。
對於檢查和非檢查是對於Javac來說的。
2、try,catch,finally,throw,throws介紹。
try後緊跟一個花括號括起來的代碼塊(花括號不可以省略),簡稱try塊。catch後對應異常類型和一個代碼塊,用於表明該catch塊用於處理這種類型的代碼塊。catch塊後可以跟finally塊,用於處理try塊打開的物理資源,異常機制會保證finally塊總被執行。throws關鍵字主要用在方法簽名上。throw可以作爲單獨語句使用,拋出一個具體的對象。
注意:
- 不管程序代碼塊是否處於try塊中,甚至包括catch塊中的代碼,只要執行該代碼塊時出現異常,系統會自動生成一個異常對象。如果程序沒有爲這段代碼定義任何的catch塊,則Java運行環境無法找到處理該異常的catch塊,程序就在此退出。
- try塊裏聲明的變量是代碼塊內的局部變量,它只在try塊內生效,在catch中不能訪問。
- 在異常捕獲時,不僅應該把Exception類對應的catch塊放在最後,而且所有的父類異常catch塊都應該排在子類的異常catch塊的最後面(簡稱:先處理小異常,再處理大異常),否則將出現編譯錯誤。
- 除非在try塊、catch塊中主動調用了退出虛擬機的方法,否則不管在try塊、catch塊中執行怎樣的代碼,出現怎樣的情況,異常處理finally塊總會被執行。
- 通常在finally塊中不使用return或throw語句。將會導致try塊和catch塊中的return、throw語句失效。
3、異常處理規則
一般異常處理有四個目標:
- 使程序代碼混亂最小。
- 捕獲並保留診斷信息。
- 通知適合的人員。
- 採用合適的方式結束異常活動。