1 異常
1.1 異常的概述
異常就是程序出現了不正常的情況,在Java中,異常是一種Exception類型的對象,所以異常也是多態的
1.2 異常處理機制
Java的異常處理(exception-handling)機制能夠將處理異常的代碼放在容易閱讀的位置上,讓程序員可以知曉調用方法的風險性
1.3 異常的體系結構
2 JVM默認處理異常的方式
- 如果程序出現了問題,我們沒有做任何處理,最終JVM 會做默認的處理,處理方式有如下兩個步驟:
- 把異常的名稱,錯誤原因及異常出現的位置等信息輸出在了控制檯
- 程序停止執行
3 try-catch方式處理異常
-
定義格式
try { 可能出現異常的代碼; } catch(異常類名 變量名) { 異常的處理代碼; }
-
執行流程
- 程序從 try 裏面的代碼開始執行
- 出現異常,就會跳轉到對應的 catch 裏面去執行,如果沒有異常,則跳過catch中的部分
- 執行完畢之後,程序還可以繼續往下執行
-
示例代碼
public class ExceptionDemo01 { 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]); System.out.println("這裏能夠訪問到嗎"); } catch (ArrayIndexOutOfBoundsException e) { // System.out.println("你訪問的數組索引不存在,請回去修改爲正確的索引"); e.printStackTrace(); } } }
如果try/catch結構後又finally,finally中的程序塊是必須執行的,無論是否出現異常
如果有多個catch塊時,要從小到大排(先子後父)
在寫try/catch時要注意以下幾點:
- catch與finally不能沒有try
- try一定要有catch或finally
- try和catch之間不能有其他程序語句
- 只帶finally的try必須聲明異常
4 Throwable成員方法(應用)
Throwable類是Java中所有錯誤和異常的超類
-
常用方法
方法名 說明 public String getMessage() 返回此 throwable 的詳細消息字符串 public String toString() 返回此可拋出的簡短描述 public void printStackTrace() 把異常的錯誤信息輸出在控制檯 -
示例代碼
public class ExceptionDemo02 { 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]); //new ArrayIndexOutOfBoundsException(); System.out.println("這裏能夠訪問到嗎"); } catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException(); // e.printStackTrace(); //public String getMessage():返回此 throwable 的詳細消息字符串 // System.out.println(e.getMessage()); //Index 3 out of bounds for length 3 //public String toString():返回此可拋出的簡短描述 // System.out.println(e.toString()); //java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 //public void printStackTrace():把異常的錯誤信息輸出在控制檯 e.printStackTrace(); // java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 // at com.itheima_02.ExceptionDemo02.method(ExceptionDemo02.java:18) // at com.itheima_02.ExceptionDemo02.main(ExceptionDemo02.java:11) } } }
5 編譯時異常和運行時異常的區別(記憶)
- 編譯時異常
- 都是Exception類及其子類
- 必須顯示處理,否則程序就會發生錯誤,無法通過編譯
- 運行時異常
- 都是RuntimeException類及其子類
- 無需顯示處理,也可以和編譯時異常一樣處理
6 throws方式處理異常(應用)
-
定義格式
public void 方法() throws 異常類名 { }
-
示例代碼
public class ExceptionDemo { public static void main(String[] args) { System.out.println("開始"); // method(); try { method2(); }catch (ParseException e) { e.printStackTrace(); } System.out.println("結束"); } /* 如果duck掉異常,相當於踢皮球,未處理異常,即在只throws異常,不使用try/catch public static void main(String[] args) throws ParseException, { System.out.println("開始"); method(); } */ //編譯時異常 public static void method2() throws ParseException { String s = "2048-08-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s); System.out.println(d); } //運行時異常 public static void method() throws ArrayIndexOutOfBoundsException { int[] arr = {1, 2, 3}; System.out.println(arr[3]); } }
-
注意事項
- 這個throws格式是跟在方法的括號後面的
- 編譯時異常必須要進行處理,兩種處理方案:try…catch …或者 throws,如果採用 throws 這種方案,將來誰調用誰處理
- 運行時異常可以不處理,出現問題後,需要我們回來修改代碼
7 throws和throw的區別
8 自定義異常
Ctrl+N輸入NullpointException可以搜索類
異常繼承自Exception或RuntimeException就在異常體系中
-
自定義異常定義格式:
public class 異常類名 extends Exception{ 無參構造 帶參構造 }
-
自定義異常類
public class ScoreException extends Exception { public ScoreException() {} public ScoreException(String message) { super(message); } }
-
老師類
public class Teacher { public void checkScore(int score) throws ScoreException { if(score<0 || score>100) { // throw new ScoreException(); throw new ScoreException("你給的分數有誤,分數應該在0-100之間"); } else { System.out.println("成績正常"); } } }
-
測試類
public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入分數:"); int score = sc.nextInt(); Teacher t = new Teacher(); try { t.checkScore(score); } catch (ScoreException e) { e.printStackTrace(); } } }