- 異常分類
- 異常的繼承結構
- Error:程式無法運作
- CheckedException:編譯的時候就報錯
- UncheckedException:運作時才報錯
- 捕獲異常
-
try-catch-finally語句塊的執行過程
程式首先執行可能發生異常的try語句塊。如果try語句沒有出現異常則執行完後跳至finally語句塊執行;如果try語句出現異常,則中斷執行并根據發生的異常類型跳至相應的catch語句塊執行處理。catch語句塊可以有多個,分别捕獲不同類型的異常。catch語句塊執行完後程式會繼續執行finally語句塊。finally語句是可選的,如果有的話,則不管是否發生異常,finally語句都會被執行。
- 注意事項
1) 即使try和catch塊中存在return語句,finally語句也會執行。是在執行完finally語句後再通過return退出。
2) finally語句塊隻有一種情況是不會執行的,那就是在執行finally之前遇到了System.exit(0)結束程式運作。
-
抛出異常(throws)
當CheckedException産生時,不一定立刻處理它,可以再把異常throws出去。如果一個方法中可能産生某種異常,但是并不能确定如何處理這種異常,則應根據異正常範在方法的首部聲明該方法可能抛出的異常。如果一個方法抛出多個已檢查異常,就必須在方法的首部列出所有的異常,之間以逗号隔開。
-
注意
方法重寫中聲明異常原則:子類重寫父類方法時,如果父類方法有聲明異常,那麼子類聲明的異常範圍不能超過父類聲明的範圍。
- 自定義異常
throw new MyException("自定義異常");
-
try-with-resources
我們知道,在Java程式設計過程中,如果打開了外部資源(檔案、資料庫連接配接、網絡連接配接等),我們必須在這些外部資源使用完畢後,手動關閉它們。因為外部資源不由JVM管理,無法享用JVM的垃圾回收機制,如果我們不在程式設計時確定在正确的時機關閉外部資源,就會導緻外部資源洩露,緊接着就會出現檔案被異常占用,資料庫連接配接過多導緻連接配接池溢出等諸多很嚴重的問題。
- 傳統的資源關閉方式
//這種方式關閉資源,代碼顯得比較臃腫
public static void main(String[] args) {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(new File("test"));
System.out.println(inputStream.read());
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}
- try-with-resources方式關閉資源
public static void main(String[] args) {
try (FileInputStream inputStream = new FileInputStream(new File("test"))) {
System.out.println(inputStream.read());
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
}