Java中的異常及異常處理方法
阿新 • • 發佈:2020-10-09
前言:
本文主要討論Java中的異常,因為java是一種強型別語言,其中的異常處理和Python語言中的異常處理還是有些許區別!!!
目 錄
一、異常
二、JVM 預設的異常處理
三、異常處理之 Try...catch...
四、Throwable 的成員方法
五、編譯型異常和執行時異常
六、異常處理之Throws
七、自定義異常類
一、異常
異常:就是程式出現不正常的情況
案例如下:
package itheima2; public class ExceptionDemo { public static void main(String[] args) {// 呼叫方法 test(); } //定義方法 -- 注意:自定義方法必須有static修飾,但是自定義類中的方法不需要static 修飾 public static void test() { int[] arr = {1, 2, 3}; System.out.println(arr[3]); //超出陣列索引範圍, } /* 報錯資訊: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at itheima2.ExceptionDemo.test(ExceptionDemo.java:14) at itheima2.ExceptionDemo.main(ExceptionDemo.java:7)*/ }
二、JVM 預設的異常處理
// 如果程式出現了問題,我們沒有解決。那麼Java虛擬機器JVM就會做預設處理 // 處理包括兩個步驟: /* 1、將異常的名稱、異常的原因和異常的位置輸出在控制檯 2、停止程式的執行 /*
三、異常處理之 Try...catch...
異常處理通常有兩種方法:
Try ... catch.. 和 Throws
Try .. catch .. 格式及執行流程:
// try ...catch...異常處理 /* 格式: try { 可能出現異常部分的程式碼; } catch(異常類名 變數名) { 異常的處理程式碼; } 執行流程: 從try裡面的程式碼開始執行,出現異常後會生成一個異常類物件,並且將這個異常類物件交給java執行時系統; java執行時系統會去catch中找匹配的異常類物件進行異常處理; 執行完異常處理的程式碼後程序會向下繼續執行!!!*/
案例:
package itheima2; // try ...catch...異常處理 /* 格式: try { 可能出現異常部分的程式碼; } catch(異常類名 變數名) { 異常的處理程式碼; } 執行流程: 從try裡面的程式碼開始執行,出現異常後會生成一個異常類物件,並且將這個異常類物件交給java執行時系統; java執行時系統會去catch中找匹配的異常類物件進行異常處理; 執行完異常處理的程式碼後程序會向下繼續執行!!! */ public class ExceptionDemo1 { public static void main(String[] args) { // TODO 方法呼叫 test(); } public static void test() { try { int[] arr = {1, 2, 3}; System.out.println(arr[3]); //超出陣列索引範圍, } catch (ArrayIndexOutOfBoundsException e) { System.out.println("索引錯誤,索引值超出陣列的索引範圍"); } } }
四、Throwable 的成員方法
Throwable 類是所有異常類的父類!如下圖所示:
Throwable類成員方法及案例如下:
package itheima2; /* * Throwable 的成員方法, Throwable 類是 所有異常類的父類 * public String getMessage() 返回throwable的詳細資訊字串 * public String toString() 返回可丟擲的簡短描述(原因) * public void printStackTrace() 將異常資訊輸出在控制檯 * */ public class ExceptionDemo2 { public static void main(String[] args) { // TODO System.out.println("開始:"); test(); System.out.println("結束:"); } public static void test() { try { int[] arr = {1, 2, 3}; System.out.println(arr[3]); //超出陣列索引範圍, } catch (ArrayIndexOutOfBoundsException e) { // System.out.println("索引錯誤,索引值超出陣列的索引範圍"); //public String getMessage() 返回throwable的詳細資訊字串 System.out.println(e.getMessage()); //public String toString() System.out.println(e.toString()); //public void printStackTrace() 將異常資訊輸出在控制檯----最常用方法 e.printStackTrace(); //注意:呼叫printStackTrace方法時會直接打印出字串,沒有返回值;因此可以直接呼叫 /* * e.printStackTrace() 執行結果如下,可以看出和jvm預設的異常處理一樣,但是程式不會終止,可以繼續向下執行; * java.lang.ArrayIndexOutOfBoundsException: 3 at itheima2.ExceptionDemo2.test(ExceptionDemo2.java:22) at itheima2.ExceptionDemo2.main(ExceptionDemo2.java:15) */ } } }
五、編譯型異常和執行時異常
異常通常分為編譯時異常和執行時異常 //編譯時異常通常都是 Exception類及其子類,需要顯示處理,不然無法編譯無法執行 //執行時異常通常都是 RuntimeException類,不需要顯示處理
編譯時異常可以理解為:在程式碼編寫過程中程式碼飄紅,出現錯誤導致程式碼無法執行;
執行時異常可以理解為:程式碼在編寫過程中沒有出現錯誤,但是執行結果顯示錯誤。
具體案例如下:
package itheima2; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; // 編譯時異常和執行時異常 public class ExceptionDemo3 { public static void main(String[] args) { // method(); method2(); } //自定義方法 public static void method() { int[] arr = {1, 2, 3}; System.out.println(arr[3]); //執行時錯誤: 編譯通過,結果報錯,可以直接在程式碼中修改 } public static void method2() { try { String ss = "2020-10-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date a = sdf.parse(ss); // 編譯時錯誤:程式碼飄紅-- System.out.println(a); } catch (ParseException e) { e.printStackTrace(); } } /* * sdf.parse() 報錯資訊:包括錯誤原因和錯誤位置 * java.lang.Error: Unresolved compilation problem: Unhandled exception type ParseException at itheima2.ExceptionDemo3.method2(ExceptionDemo3.java:25) at itheima2.ExceptionDemo3.main(ExceptionDemo3.java:12) */ }
六、異常處理之Throws
一般的異常使用try catch來處理,但是當遇到一些超出許可權的異常時我們需要將異常丟擲,比如說將異常拋給方法的呼叫者,由方法的呼叫者進行異常處理!!!
/* throws 異常處理格式如下: public void 方法名() throws 異常類名{
} 注意: 該格式放在方法()的後面 */
案例如下:
package itheima2; /* throws 異常處理方法 格式: throws 異常類名 注意: 該格式放在 方法()的後面。案例如下: */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ExceptionDemo4 { public static void main(String[] args) { // method(); //在方法呼叫的時候進行try catch 異常處理, 在方法編寫的時候用throws 異常類名 ,將異常丟擲 try { method2(); } catch(ParseException e) { e.printStackTrace(); } } //執行時異常 public static void method() { int[] arr = {1, 2, 3}; System.out.println(arr[3]); //執行時錯誤: 編譯通過,結果報錯,可以直接在程式碼中修改 } //編譯時異常 public static void method2() throws ParseException{ String ss = "2020-10-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date a = sdf.parse(ss); // 編譯時錯誤:程式碼飄紅-- System.out.println(a); } }
七、自定義異常類
自定義異常類就是繼承Exception類,並給出無參和帶參構造方法!
案例如下:
自定義異常類:
package itheima2; // 自定義分數異常類,繼承Exception類 public class ScoreException extends Exception{ //有參無參構造方法 public ScoreException(){} public ScoreException(String message) { super(message); } }
教師類:
package itheima2; //自定義教師類 public class Teacher { //成員方法 public void checkScore(int score) throws ScoreException { //利用throws來丟擲異常,給方法呼叫者進行處理 //執行判斷過程 if(score < 0 || score > 100) { //丟擲異常資訊,可以無參方法也可以是帶參方法 // throw new ScoreException(); throw new ScoreException("給出的數值不在範圍內"); } else { System.out.println("成績正常!"); } } }
測試類:
package itheima2; import java.util.Scanner; public class TestDemo { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); System.out.println("請輸入分數:"); int score = sc.nextInt(); //異常處理 try { Teacher tt = new Teacher(); tt.checkScore(score); } catch(ScoreException e) { e.printStackTrace(); } } } /* 執行結果如下: 請輸入分數: 111 itheima2.ScoreException: 給出的數值不在範圍內 at itheima2.Teacher.checkScore(Teacher.java:12) at itheima2.TestDemo.main(TestDemo.java:17) */