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

  • 2019 年 10 月 12 日
  • 筆記

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();          }        }  }

 

溫馨提示

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