一、Java中,非正常情況分爲兩種:異常Exception和錯誤Error。
1.Error錯誤無法處理,Error錯誤一般是與虛擬機相關的問題,如系統崩潰、虛擬機錯誤、動態鏈接失敗等。
2.Java將異常分爲兩種:Checked異常和Runtime異常
在Java中,Checked異常都是可以在編譯階段可以被處理的異常,因此Java強制程序處理所有的Checked異常,Runtime異常則無需程序編寫人員處理。
3.對Checked異常處理的兩種方式:①當前方法明確知道如何處理該異常,使用try...catch塊來捕獲異常,然後在對應的catch塊中修復異常。
②當前方法不知道如何處理該異常,應該在定義該方法時聲明拋出該異常。此時可以使用throws關鍵字聲明拋出異常。
該異常將由上一級調用者處理,如果main方法也不知道如何處理異常,也可使用聲明拋出異常,交給JVM處理。
JVM將跟蹤棧信息打印處理啊,中止運行的程序(example:public void test() throws Exception1,Exception2 {} )。
使用throws拋出異常的一個限制:子類方法聲明拋出的異常類型應該是父類方法聲明拋出的異常類型的子類或相同,
子類方法聲明拋出的異常不允許比父類方法聲明拋出的異常多。
4.Runtime異常無需顯式聲明拋出,如果需要捕獲Runtime異常也可使用try...catch塊。
二、Java異常處理機制的語法結構:
try {
//業務邏輯
} catch(Exception e) {//(Exception e)表示該catch塊用於處理該異常類及其子類的異常實例
//進行異常處理
}
1.異常拋出:當try塊中的業務邏輯代碼執行過程中出現異常時,系統自動生成一個異常對象,
該異常對象被提交Java運行時環境,此爲拋出異常。
2.當Java運行時環境接收到異常對象時,會尋找能處理該異常對象的catch塊,如果找到合適的catch塊,
則將該異常對象交給該catch塊處理,此爲捕獲異常,
如果找不到捕獲異常的catch塊,則運行時環境終止,程序退出。
3.注意:無論程序是否包含try、catch塊,當程序執行過程中出現異常時,系統總會自動生成一個異常對象,
如果沒有對異常對象進行處理,運行環境終止,程序退出。
三、多catch塊的執行:try塊後可以跟多個catch塊,方便處理不同的異常類。
程序執行過程中不同的意外情況會產生不同的異常對象,
Java運行時環境接收到異常對象後會依次與catch塊中的異常類進行比較,
以決定使用哪個catch塊來處理該異常。 如果try塊被執行一次,則try塊後只有一個catch塊會被執行。
在編寫異常捕獲時,應該把所有父類異常的catch塊排在子類異常catch塊的後面(先處理小異常,再處理大異常),否則將出現編譯錯誤。
四、對異常信息的訪問:異常對象中包含的用於訪問異常信息的幾個方法:
getMessage():返回該異常的詳細描述字符串
printStackTrace():將該異常的跟蹤棧信息輸出到標準錯誤輸出
printStackTrace(PrintStream s):將該異常的跟蹤棧信息輸出到指定輸出流
getStackTrace():返回該異常的跟蹤棧信息
五、使用finally回收資源:爲了保證一定能回收try塊中打開的資源,異常處理機制提供了finally塊。
無論try塊中代碼是否出現了異常,也不管哪個catch塊被執行,甚至在try塊中或catch塊中執行了return語句,finally塊總會被執行。
注意:如果異常處理代碼中使用System.exit(1);語句退出虛擬機,則finally塊失去執行機會。
注意:應當儘量避免在finally塊中使用return或throw等導致方法終止的語句。
完整的Java異常處理語法結構:
try {
} catch(SubException e) {
//處理異常
} catch(SubException e) {
//處理異常
} finally {
//進行資源回收(數據庫連接、網絡連接、磁盤文件等)
}
try塊出現時,catch塊和finally塊至少出現其中之一,也可以同時出現,finally塊必須位於所有catch塊之後。異常處理支持嵌套。
六、使用throw拋出異常:使用throw語句可以完成程序自行拋出異常(throw ExceptionInstance),throw語句可以單獨使用,它拋出一次拋出一個異常實例。
當程序執行到出現異常時,將會中止當前的執行流,調到異常對應的catch塊,使用throw拋出的異常,亦是如此。
catch和throw同時使用,可以用於完成幾個方法協作處理一個異常的工作,在一個方法中進行部分處理,然後再次拋出。
異常轉譯:程序先捕獲異常,然後拋出一個新的業務邏輯,然後新的業務異常包含了對用戶的提示信息。
七、Java7中異常處理機制的新特性:多異常捕獲、自動關閉資源的try塊、增強的throw語句
1.多異常捕獲即使用一個catch塊捕獲多種類型的異常,多種異常類型之間用(|)隔開,異常變量有隱式的fanal修飾
2.自動關閉資源的try塊:在try關鍵字後緊跟一對圓括號,圓括號中可以聲明、初始化一個或多個資源,try語句在該語句結束時自動關閉這些資源(這些資源實現類必須實現了 AutoCloseable或Closeable接口)。此時,try語句塊相當於包含了隱式的finally塊,因此可以既沒有catch塊和finally塊。
3.從Java7開始,Java編譯器會檢查throw語句拋出異常的實際類型。
例子:public static void main(String[] args) throws FileNotException {//throws Exception
try {
new FileOutputStream("a.txt");
} catch(Exception ex) {
ex.printStackTrace();
throw ex;//在JAVA7以前,編譯器會認爲可斷代碼可能拋出Exception異常
}
}