Java異常處理的兩種方式以及自定義異常的使用方法

young檸檬味 發表於 2021-08-24
Java

異常

就是程式出現了不正常的情況

Java異常處理的兩種方式以及自定義異常的使用方法

Error:嚴重問題,不需要處理

Exception:稱為異常類,他表示程式本身可以處理的問題

  • RuntimeException:在編譯期是不檢查的,出現問題後,需要我們回來修改程式碼

  • 非RuntimeException:編譯期就必須處理的,否則程式不能通過編譯,就更不能正常執行了

JVM的預設處理方案

如果程式出現了問題,我們沒有做任何處理,最終JVM會做預設的處理

  • 把異常的名稱,異常原因及異常出現的位置等資訊輸出在控制檯

  • 程式停止執行

異常處理

兩種方案:

  • try...catch....

  • throws.....

try...catch...
try{
	可能出現異常的程式碼;
}catch(異常類名 變數名){
	異常的處理程式碼;
}

執行流程:

程式從try裡面的程式碼開始執行

出現異常,會自動生成一個異常類物件,該異常物件被提交給Java執行時的系統

當Java執行時系統接收到異常物件時,回到catch中去找匹配的異常類,找到後進行異常的處理

執行完畢後,程式還可以繼續往下執行

Throwable的成員方法:

Java異常處理的兩種方式以及自定義異常的使用方法

 

public class Demo1 {
    public static void main(String[] args) {
        System.out.println("開始");
        method();
        System.out.println("結束");
    }
    public static void method(){
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("你輸入的索引有誤");
            e.printStackTrace();
            System.out.println("---------");
            System.out.println(e.getMessage());
            System.out.println("--------------");
            System.out.println(e.toString());
        }
    }
}
編譯時異常和執行時異常的區別

Java中的異常被分為兩大類:編譯時異常和執行時異常,也被稱為受檢異常和非受檢異常

所有的RuntimeException類及其子類被稱為執行時異常,其他的異常都是編譯時異常

  • 編譯時異常:必須顯示處理,否則程式就會發生錯誤,無法通過編譯

  • 執行時異常:無需顯示處理,也可以和編譯時異常一樣處理

throws

通過try...catch...可以對異常進行處理,但是並不是所有的情況我們都有許可權進行異常的處理,也就是說,有些時候可能出現的異常時我們處理不了的,怎麼辦?

因此Java提供了throws的處理方案

throws 異常類名;

注:這個格式時跟在方法的括號後面的

  • 編譯時異常必須要進行處理,兩種處理方案:try...catch...或者throws,如果採用throws這種方案,將來誰呼叫誰處理

  • 執行時異常可以不處理,出現問題後,需要我們回來修改程式碼

public class Demo2 {
    public static void main(String[] args) {
        try {
            method();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }  
    public static void method() throws ParseException {
        String date = "2020-06-23";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = sdf.parse(date);
        System.out.println(parse);
    }
}

自定義異常

Public class 異常類名 extends Exception{
    無參構造
    有參構造
}
throws和throw的區別

throws:

  • 用在方法宣告後面,跟的是異常類名

  • 表示丟擲異常,由該方法的呼叫者來處理

  • 表示出現異常的一種可能性,並不一定會發生這些異常

throw:

  • 用在方法體內,跟的是異常物件名

  • 表示丟擲異常,由方法體內的語句處理

  • 執行throw一定丟擲了某種異常

 1 //自定義異常
 2 public class ScoreException extends Exception{
 3     public ScoreException(){}
 4     public ScoreException(String message){
 5         super(message);
 6     }
 7 }
 8 //異常使用類
 9 public class Teacher {
10     public void scoreTest(int score) throws ScoreException {
11         if(score < 0 || score>100){
12             throw new ScoreException("您輸入的分數有誤,請重新輸入");
13         }else{
14             System.out.println("輸入的分數正常");
15         }
16     }
17 }
18 //異常測試類
19 public class ScoreExceptionTest {
20     public static void main(String[] args) {
21         Scanner sc = new Scanner(System.in);
22         System.out.println("請輸入成績:");
23         int score = sc.nextInt();
24         Teacher teacher = new Teacher();
25         try {
26             teacher.scoreTest(score);
27         } catch (ScoreException e) {
28             e.printStackTrace();
29         }
30     }
31 }