10.Java異常機制
阿新 • • 發佈:2021-11-02
1、什麼是異常(Exception)
- 異常是指程式執行中出現得不期而至得各種狀況。如:檔案找不到、網路連線失敗、非法引數等待
2、異常體系結構
一、要理解java異常處理是如何工作得,需要掌握以下三種情況
-
檢查性異常:最具代表性得檢查性異常是使用者錯誤或者問題引起得異常,這是程式設計師無法預見得。例如要開啟一個不存在得檔案時,一個異常就發生了,這些異常在編譯時不能被簡單得忽略。
-
執行時異常:執行時異常是可能被程式設計師避免得異常。於檢查性異常相反,執行時異常可以在編譯時被忽略
-
錯誤(ERROR):錯誤不是異常,而是脫離程式設計師控制得問題。錯誤在程式碼中通常被忽略。例如,當棧溢位時,一個錯誤就發生了,他們在編譯也檢查不到。
二、java把異常當作物件處理,並定義一個基類java.lang.Throwable,其結構如下:
- Error類物件是由java虛擬機器生成並丟擲,大多數錯誤與程式碼編寫者所執行的操作無關。
- Exception類物件一般由程式邏輯錯誤引起,程式應該從邏輯角度儘可能避免。
3、java異常處理機制
一、丟擲異常
當異常發生時,java虛擬機器會自動丟擲異常並給與提示,也可以通過throw、throws主動丟擲異常
- throw:
- 表示方法內丟擲某種異常
- 如果異常物件是非RuntimeException,則需要在方法體上加上throws丟擲該異常,或者在方法體內用try、catch處理該異常,否則編譯報錯
- 執行到throw語句則後面的語句不再執行
- throws:
- 在方法體上使用,表示這個方法可能丟擲某種異常
- 需要由方法的呼叫著進行異常處理
package com.exception; import java.io.IOException; public class Test1 { public static void main(String[] args) { try { testThrows(1,0); }catch (ArithmeticException e){ System.out.println("Throws丟擲異常"); } try { testThrow(1,0); }catch (ArithmeticException e){ System.out.println("Throw關鍵字丟擲執行時異常,不需要在方法體上宣告"); } String filePath = null; try{ testThrow(filePath); }catch (IOException e){ System.out.println("Throw關鍵字丟擲非執行時異常,需要在方法體加throws異常丟擲宣告"); } } //測試Throws關鍵字 public static void testThrows(int a,int b) throws ArithmeticException{ System.out.println(a/b); } //測試Throw關鍵字丟擲執行時異常 public static void testThrow(int a,int b) { if (b == 0){ throw new ArithmeticException();//執行時異常不需要在方法體上宣告 } } //測試Throw關鍵字丟擲非執行時異常,需要在方法體加throws異常丟擲宣告 public static void testThrow(String filePath) throws IOException { if (filePath == null){ throw new IOException();//執行時異常不需要在方法體上宣告 } } }
二、捕獲異常
可以通過try、catch、finally關鍵字對異常進行捕獲、處理。
package com.exception;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
//捕獲多個異常:異常的型別必須是從小到大捕獲
try {//try監控區域
System.out.println(a/b);
}catch (Error e){//catch後跟想要捕獲地異常型別
System.out.println("程式出現錯誤");
}catch (Exception e){
System.out.println("程式出現異常,除數不能為零");
}catch (Throwable t){
System.out.println("程式出現異常或者錯誤");
}
finally {//不管有不有異常發生都會被執行
System.out.println("finally");
}
}