Java基礎第二遍-09-面向物件-異常
阿新 • • 發佈:2021-10-27
簡介
- Java中用類的形式對不正常情況進行了描述和封裝物件
- 描述不正常情況的類就稱為異常類
- 在有專門的異常類之前,正常流程程式碼和問題處理程式碼相結合
- 在有異常類之後,將正常流程程式碼與問題處理程式碼進行分離,提高閱讀性
- 異常:就是Java通過面向物件的思想將問題封裝成了一個物件,用異常類(Throwable異常類的祖宗類)對其進行描述,不同的問題使用不同的類進行描述
- Throwable下有兩個子類,無論是Error還是Exception 都是程式執行過程中的問題,都需要通知呼叫者,所以需要丟擲
- Error:描述不可解決問題,一般是由JVM丟擲的嚴重性問題,解決方案,修改程式
- Exception:可處理問題
- Throwable的及其所有的子類都具有可拋性,凡是具有可拋性的類或物件都可以被throw、throws操作,同理被他們操作的都具有可拋性。
異常的分類-及異常的宣告
- 編譯時被檢測異常:只要是Exception和其子類都是,除了特殊類RuntimeException類
- 編譯時檢測是為了希望,這種問題儘早的進行處理
- 編譯時不檢測異常(執行時異常):就是Exception中的RuntimeException和其子類。
class MyException extends Exception{//直接繼承的是Eception在使用此類的時候需要宣告 } class Test13{ int mothod(int [] arr, int index) { return arr[index]; } void test() throws MyException {//宣告異常類 throw new MyException();//此異常類為編譯檢測異常類,需要進行宣告 } }
2. 這種問題的發生更多是呼叫者使用不當造成的,一般不進行處理,直接編譯通過,在執行的時候強制程式,讓呼叫者修改程式
class MyException_2 extends RuntimeException{//直接繼承的是RuntimeEception在使用此類的時候不進行宣告 } class Test13_2{ int mothod(int [] arr, int index) { return arr[index]; } void test(){ throw new MyException_2();//此異常類為執行時檢測異常類,不進行宣告 } }
- 為什麼進行異常的宣告?
- 是為了對異常進行處理
try{}catch(){}finally{}
- 是為了對異常進行處理
- 總結:
- 所以自定義異常要麼繼承Exception、或者RuntimeException
異常處理的捕獲
- 格式:
try{}catch(){}finally{}
- 執行流程:
package com.bixiangdong.oop;
class MyException14 extends RuntimeException{
MyException14(String message){
super(message);
}
}
class Test14{
int method(int[] arr,int index){
if (index<0)
throw new MyException14("下標不能為負數");
return arr[index];
}
}
public class Demo14 {
public static void main(String[] args) {
try{
new Test14().method(new int[]{1,232,5,3,53},-1);
}catch (MyException14 e){
System.out.println(e);
System.out.println(e.toString());//異常處理類中 e是一個物件,應該打印出一個記憶體地址,
// 但是java對其進行了一系列處理,所以打印出來的是一個訊息字串
e.printStackTrace();//JVM的異常列印機制呼叫的也是這個方法
}
}
}
- 如果丟擲多個異常,需要使用多個catch進行處理,catch(XXException e)其中的xxException需要按照從子類到父類依次往下寫
try {
new Test14().method(new int[]{1,232,5,3,53},-1);
}catch (MyException14 e){//兒子類
}catch (RuntimeException e){//爸爸類
}catch (java.lang.Exception e){//爺爺類
}
異常的丟擲流程
- 異常丟擲throw
- 異常丟擲throws
自定義異常
- 命名特點:xxxxException、xxxxError
異常處理的規則
- 函式內容如果丟擲需要檢測的異常,那麼函式上必須要宣告(throws),否則在函式內部使用try{}catch(){}捕捉,否則編譯失敗
- 如果呼叫了宣告異常的函式,要麼try{}catch(){},要麼throws,否則編譯失敗
- 什麼時候使用catch、什麼時候使用throws?
- 如果可以處理就用catch
- 不能處理,就用throws丟擲異常,給呼叫者處理(try{}catch(){})
- 一個功能如果丟擲多個異常,那麼就需要catch幾個異常,且按子類 父類依次捕獲