1. 程式人生 > >Java基礎學習(七) - 異常處理

Java基礎學習(七) - 異常處理

1.異常概念

異常指的是程式在執行過程中出現的非正常的情況,導致JVM的非正常停止。在Java中,異常是一個類,產生異常就是建立異常物件並丟擲一個異常物件。

異常指的並不是語法錯誤,語法錯誤,編譯不會通過,而是編譯通過後,程式執行異常。

異常的作用是幫助我們找到程式中的問題。

2.異常產生過程解析

public class TestException {
    public static  void  main(String[] args){
        int[] arr = {1,2,3};
        System.out.println(arr[3]);
    }
}

 執行過程解析:

  1. 在 arr 陣列中提取索引 3,由於陣列沒有索引3,導致了執行異常,JVM對這個異常做了識別,並丟擲異常給 main 方法。
  2. 由於 main 方法並沒有異常處理,main 方法又把異常返回給 JVM。
  3. JVM 收到異常後,列印異常詳細資訊到控制檯,同時中斷程式。

3.異常類

java.lang.Throwable 是異常的根類。

Throwable 體系:

  • java.lang.Error:嚴重錯誤,不在我們處理範圍內。
  • java.lang.Exception:平時所說的異常是此類。我們可以通過修改程式碼糾正錯誤,使程式能正常執行。異常又分為checked異常(編譯異常)和runtime異常(執行異常)。

Throwable 常用方法:

  • public void printStackTrace():列印異常的詳細資訊。
  • public String getMessage():獲取異常發生的原因。

 4.異常處理

Java 異常處理的五個關鍵字: try、catch、finally、throw、throws。

  • throw 丟擲異常。
  • throws 宣告異常。
  • try...catch...finally 捕獲異常。

throw:

public class TestException {
    public static  void  main(String[] args){
        int[] arr = {1,2,3};
        int index = 3;
        if (index < 0 || index > arr.length -1){
            throw  new ArrayIndexOutOfBoundsException("陣列越界");
        }
        System.out.println(arr[index]);
    }
}

throws 用於方法宣告之上,表示當前方法不處理異常,並提醒該方法的呼叫者來處理異常。

若該方法可能有多種異常情況產生,那麼在throws後面可以寫多個異常類,用逗號隔開。

public class TestException {
    public static  void getIndex(int index) throws ArrayIndexOutOfBoundsException{
        int[] arr = {1,2,3};
        if (index < 0 || index > arr.length -1){
            throw  new ArrayIndexOutOfBoundsException("陣列越界");
        }
    }
    public static  void  main(String[] args) throws  ArrayIndexOutOfBoundsException{
        getIndex(4);

    }
}

try-catch 用於對異常有針對性的語句進行捕獲,可以對出現的異常進行制定方式處理。finally程式碼塊無論有無捕獲異常都會執行。

public class TestException {
    public static  void  main(String[] args){
        int[] arr = {1,2,3};
        //捕獲陣列越界異常
        try{
            System.out.println(arr[4]);
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();//獲取異常詳細資訊
        }finally{
       System.out.println("程式繼續執行");
    }
        //繼續執行
        System.out.println(arr[2]);

    }
}

可以寫多個catch 捕獲多個異常。需要注意的是catch捕獲異常不能相同,異常子類一般要寫在異常父類上面,否則異常被父類捕獲,子類無法捕獲詳細異常。

在繼承關係當中,如果父類丟擲異常,那麼子類重寫父類方法時,丟擲和父類相同的異常或者不丟擲異常。如果父類沒有丟擲異常,子類重寫父類該方法時也不可丟擲異常,若該子類方法產生異常,只能捕獲不能宣告丟擲。

5.自定義異常類

原理:自定義異常類繼承 Exception 根類。

//自定義異常類
class CustomException extends Exception{
    //無參構造方法
    public CustomException(){};
    //有參
    public CustomException(String msg){
        super(msg);//繼承Exception 構造方法
    }
}
//測試
public class TestCustomException {
    public static  void  main(String[] args){
        int[] arr = {1,2,3};
        int index = 3;
        try{
            if (index<0  || index>arr.length-1){
                throw  new  CustomException("陣列越界");
            }
        }catch (CustomException e){
            e.printStackTrace();
        }

    }
}

 

溫馨提示

  • 如果您對本文有疑問,請在評論部分留言,我會在最短時間回覆。
  • 如果本文幫助了您,也請評論關注,作為對我的一份鼓勵。
  • 如果您感覺我寫的有問題,也請批評指正,我會盡量修改。

&n