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]); } }
執行過程解析:
- 在 arr 陣列中提取索引 3,由於陣列沒有索引3,導致了執行異常,JVM對這個異常做了識別,並丟擲異常給 main 方法。
- 由於 main 方法並沒有異常處理,main 方法又把異常返回給 JVM。
- 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