Java異常相關知識點歸納
1.Java中異常的種類
Throwable是所有異常的父類,有兩個直接子類Error和Exception。
Error表示系統錯誤,通常不能預期和恢復(如JVM崩潰,記憶體不足等),除退出執行外沒有其他方法,是由Java虛擬機器丟擲的。
Exception又分為被檢查型異常和執行時異常(不受檢查的異常)
2.被檢查異常與執行時異常之間的區別
被檢查的異常應該用try-catch塊程式碼處理或用throws關鍵字丟擲,不受檢查的異常在程式中不要求被處理或使用throws丟擲;
Exception是所有受檢查異常的基類,RuntimeException是所有執行時異常的基類;Exception可以捕獲所有異常,也包括執行時異常。
被檢查異常適用於那些不是因為程式錯誤引起的異常(如FileNotFoundException),執行時異常通常是因為程式錯誤引起的(如NullPointerException);
3.throw和throws的區別
throw使用的位置在方法中,後面跟要丟擲的異常物件例項,由方法體內的語句進行處理。如果throw 丟擲 RuntimeException及其子類,則方法宣告上可以沒有throws,如果throw丟擲Exception及其子類,則方法宣告上必須有throws。
throws 使用的位置在方法引數小括號後面,後面跟的是一個或者多個異常類名且用逗號隔開,表示丟擲異常並交給呼叫者去處理,如果後面根據的是 RuntimeException 及其子類則該方法可以不用處理,如果後面根據的是 Exception 及其子類則必須要編寫程式碼進行處理或者呼叫的時候丟擲。
4.Java中的異常鏈
異常鏈是指在處理一個異常時丟擲了另一個異常,由此產生了一個異常鏈條。如果你因為一個異常而決定丟擲另一個新的異常時一定要包含原有的異常,這樣處理程式才可以通過 getCause() 和 initCause() 方法來訪問異常最終的根源。
5.finally程式碼塊的執行問題
只有在try裡面通過System.exit(0)退出JVM時,才不會執行finally中的程式碼,其他情況下都會執行finally程式碼塊。
在finally程式碼塊中的return值會覆蓋掉try程式碼塊中的return值,finally程式碼塊丟擲的異常也會覆蓋掉try程式碼塊中的異常,所以要避免在finally中使用return語句或者丟擲異常。
6.Java異常處理流程
(1)程式執行出現異常後,JVM根據異常類的型別例項化一個與異常類對應的異常物件並丟擲;
(2)判斷當前語句是否存在異常處理,如沒有異常處理,則將異常交給JVM進行預設的異常處理,處理方式為列印異常資訊,結束程式呼叫。
(3)如果存在異常處理語句,則由try語句來捕獲產生的異常物件,並且與catch語句中的異常類型別進行匹配,如果匹配到對應的異常類型別,則進入到其catch語句中執行處理過程;如果沒有匹配到對應的型別,則會交給JVM進行預設的異常處理。