1. 異常層次結構圖
圖片來自網絡,侵刪。
Java異常的處理機制是:拋出異常,捕獲異常
Java異常都是對象,都派生自java.langThrowable類,主要分爲Exception和Error兩類
- Error:程序無法處理的嚴重錯誤, 比如OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。
- Exception:程序本身可以處理的異常,分爲運行時異常和編譯時異常兩大類。
2. Exception細分
①運行時異常(非檢測異常)
包括很多,比如
- IndexOutOfBoundsException
- NullPointerException
- ArithmeticException
- IllegalArgumentException
- ClassNotFoundException
…
這些異常不需要捕獲的,代碼在編譯階段不會報錯,可以執行。比如常見的代碼如下
public static void main(String[] args) {
int a = 1, b = 0;
System.out.println(a / b);
}
②編譯時異常(檢測異常)
這種異常必須拋出或者捕獲,不然代碼編譯不通過。常見的有
- IOException
- SQLException
…
3. 異常的捕獲
①. try-catch
public class ArithmeticExceptionDemo {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println("錯誤:" + a / b);
System.out.println("無法輸出");
} catch (ArithmeticException e) {
System.out.println("aa");
} catch (RuntimeException e) {
System.out.println("Runtime");
}
System.out.println("照樣輸出");
}
}
如這段代碼輸出的結果是
aa
照樣輸出
- 在try語句塊中異常的語句不會輸出,其後面的語句更不會執行。
- catch可以編寫多個,但是先編寫的必須是子類,需要按小到大來排,不然編譯錯誤,因爲異常最多隻能被一個catch捕獲,其餘的catch沒事幹了。
- 最後的 “照樣輸出” 是程序執行異常處理後執行的。
②. try-catch-finally
public class ArithmeticExceptionDemo {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println("hh");
return;
} catch (ArithmeticException e) {
System.out.println("aa");
} catch (RuntimeException e) {
System.out.println("Runtime");
} finally {
System.out.println("finally");
}
System.out.println("照樣輸出");
}
}
輸出爲
hh
finally
finally語句塊是方法返回前必須執行的,也就是輸出了“hh“後,下一條語句不是return;,而是執行finally語句塊
也可以直接使用 try-finally
4. 自定義異常
public class ExceptionTest {
public static int sum(int a, int b) {
if (a + b >= 5)
return a + b;
else
throw new MyException("和不能小於5");
}
public static void main(String[] args) {
try {
sum(1, 2);
} catch (MyException e) {
System.err.println(e.getMessage());
}
}
}
class MyException extends RuntimeException {
private String message;
public MyException(String error) {
message = error;
}
@Override
public String getMessage() {
return "拋出異常:" + message;
}
}
輸出
拋出異常: 和不能小於5
比較簡單,直接繼承某個Exception即可,重寫裏面的一些異常信息方法即可。
使用的時候直接拋出,然後捕獲