異常
就是程式出現了不正常的情況
Error:嚴重問題,不需要處理
Exception:稱為異常類,他表示程式本身可以處理的問題
-
RuntimeException:在編譯期是不檢查的,出現問題後,需要我們回來修改程式碼
-
非RuntimeException:編譯期就必須處理的,否則程式不能通過編譯,就更不能正常執行了
JVM的預設處理方案
如果程式出現了問題,我們沒有做任何處理,最終JVM會做預設的處理
-
把異常的名稱,異常原因及異常出現的位置等資訊輸出在控制檯
-
程式停止執行
異常處理
兩種方案:
-
try...catch....
-
throws.....
try...catch...
try{ 可能出現異常的程式碼; }catch(異常類名 變數名){ 異常的處理程式碼; }
程式從try裡面的程式碼開始執行
出現異常,會自動生成一個異常類物件,該異常物件被提交給Java執行時的系統
當Java執行時系統接收到異常物件時,回到catch中去找匹配的異常類,找到後進行異常的處理
執行完畢後,程式還可以繼續往下執行
Throwable的成員方法:
public class Demo1 { 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]); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("你輸入的索引有誤"); e.printStackTrace(); System.out.println("---------"); System.out.println(e.getMessage()); System.out.println("--------------"); System.out.println(e.toString()); } } }
Java中的異常被分為兩大類:編譯時異常和執行時異常,也被稱為受檢異常和非受檢異常
所有的RuntimeException類及其子類被稱為執行時異常,其他的異常都是編譯時異常
-
編譯時異常:必須顯示處理,否則程式就會發生錯誤,無法通過編譯
-
執行時異常:無需顯示處理,也可以和編譯時異常一樣處理
throws
通過try...catch...可以對異常進行處理,但是並不是所有的情況我們都有許可權進行異常的處理,也就是說,有些時候可能出現的異常時我們處理不了的,怎麼辦?
因此Java提供了throws的處理方案
throws 異常類名;
-
編譯時異常必須要進行處理,兩種處理方案:try...catch...或者throws,如果採用throws這種方案,將來誰呼叫誰處理
-
執行時異常可以不處理,出現問題後,需要我們回來修改程式碼
public class Demo2 { public static void main(String[] args) { try { method(); } catch (ParseException e) { e.printStackTrace(); } } public static void method() throws ParseException { String date = "2020-06-23"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date parse = sdf.parse(date); System.out.println(parse); } }
Public class 異常類名 extends Exception{ 無參構造 有參構造 }
throws和throw的區別
-
用在方法宣告後面,跟的是異常類名
-
表示丟擲異常,由該方法的呼叫者來處理
-
表示出現異常的一種可能性,並不一定會發生這些異常
throw:
-
用在方法體內,跟的是異常物件名
-
表示丟擲異常,由方法體內的語句處理
-
執行throw一定丟擲了某種異常
1 //自定義異常 2 public class ScoreException extends Exception{ 3 public ScoreException(){} 4 public ScoreException(String message){ 5 super(message); 6 } 7 } 8 //異常使用類 9 public class Teacher { 10 public void scoreTest(int score) throws ScoreException { 11 if(score < 0 || score>100){ 12 throw new ScoreException("您輸入的分數有誤,請重新輸入"); 13 }else{ 14 System.out.println("輸入的分數正常"); 15 } 16 } 17 } 18 //異常測試類 19 public class ScoreExceptionTest { 20 public static void main(String[] args) { 21 Scanner sc = new Scanner(System.in); 22 System.out.println("請輸入成績:"); 23 int score = sc.nextInt(); 24 Teacher teacher = new Teacher(); 25 try { 26 teacher.scoreTest(score); 27 } catch (ScoreException e) { 28 e.printStackTrace(); 29 } 30 } 31 }