異常
就是程式出現了不正常的情況
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的區別
throws:
用在方法聲明後面,跟的是異常類名
表示丟擲異常,由該方法的呼叫者來處理
表示出現異常的一種可能性,並不一定會發生這些異常
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 }