例外
一、例外:就是程式出現不正常的情況,
| Throwable | Error | |
| Exception | RuntimeException | |
| 非RuntimeException | ||
- Error:嚴重問題,不處理
- Exception:例外類,程式本身可以處理
- RuntimeException:編譯期間不檢查,程式出現問題再修改代碼
- 非RuntimeException:編譯期間處理,否則程式不能通過編譯,更不能運行
二、例外處理方案:
1. try...catch...
2. throws
1. try...catch...
//系統默認處理例外方式
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("開始");
method();
System.out.println("結束");
}
public static void method (){
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
}
運行結果:當出現例外時,程式不能繼續往下執行
開始
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:17)
at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)
//try...catch..處理例外
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("開始");
method();
System.out.println("結束");
}
public static void method (){
int[] arr = {1,2,3};
try {
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
}
運行結果:當出現例外時,程式能繼續往下執行
開始
結束
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:18)
at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)
2. Throwable:所有例外的父類,包含的一些方法
public String getMessage() 回傳例外資訊
public String toString() 回傳可拋出的簡短說明
public void printStackTrace() 列印詳細例外資訊
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("開始");
method();
System.out.println("結束");
}
public static void method (){
int[] arr = {1,2,3};
try {
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
//e.printStackTrace();
//回傳例外資訊
System.out.println("例外資訊:"+e.getMessage());
//回傳可拋出的簡短說明
System.out.println("簡短說明:"+e.toString());
//列印詳細例外資訊
e.printStackTrace();
}
}
}
運行結果:
開始
例外資訊:Index 3 out of bounds for length 3
簡短說明:java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
結束
//詳細例外資訊
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:18)
at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)
3. 編譯時例外和運行時例外的區別
運行時例外:
public class ExceptionDemo1 {
public static void main(String[] args) {
method();
}
public static void method (){
int[] arr = {1,2,3};
//這個索引越界了,但是寫代碼時沒有報錯,運行的時候才報錯
//所以,這是個運行時例外
System.out.println(arr[3]);
}
}
運行結果:ArrayIndexOutOfBoundsException
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo1.method(ExceptionDemo1.java:17)
at com.chawaner.test2.ExceptionDemo1.main(ExceptionDemo1.java:10)
編譯時例外:不一定會出問題,但有可能會出問題

4. throws
有時候例外能夠用try...catch...處理,有時候可能出現的例外是我們處理不了的,這個時候用throws解決,
在方法括號后跟上throws 例外類名

運行結果:throws可以解決編譯時例外那個紅色波浪線的提示,
Wed Nov 09 00:00:00 CST 2022

運行結果:運行時例外用throws解決不了,只是拋出例外,還得用try...catch...處理,才能在提示報錯后,繼續執行后面的程式,
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo1.method(ExceptionDemo1.java:24)
at com.chawaner.test2.ExceptionDemo1.main(ExceptionDemo1.java:14)

總結:
- 運行時例外用try...catch...
- 編譯時例外用throws或者try...catch...
- try...catch...是有顯示處理的,就是用try...catch...你可以自己處理例外
- throws是拋出例外,控制臺顯示的是系統給的例外結果
自定義例外
寫一個類,讓類繼承Exception
//自己寫的JException例外類
public class JException extends Exception{
public JException() {
}
public JException(String message) {
super(message);
}
}
/*
IntNumber類,里面有個檢查數字范圍的方法checkNum(int i)
checkNum(int i)方法是由JException拋出的
JException拋出的例外結果顯示為:輸入的數字有誤,范圍應為:0-100
*/
public class IntNumber {
public void checkNum(int i) throws JException{
if (i < 0 || i > 100) {
//拋出例外,并顯示自己寫的例外結果資訊
throw new JException("輸入的數字有誤,范圍應為:0-100");
}else {
System.out.println("正常");
}
}
}
//測驗類:輸入數字,并檢查數字的范圍
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個數字:");
int i = sc.nextInt();
IntNumber in = new IntNumber();
try {
//編譯時例外
in.checkNum(i);
} catch (JException e) {
e.printStackTrace();
}
}
}
//運行結果:控制臺顯示了自定義例外類JException
//以及自己處理的例外顯示結果:輸入的數字有誤,范圍應為:0-100
請輸入一個數字:
120
com.chawaner.test3.JException: 輸入的數字有誤,范圍應為:0-100
at com.chawaner.test3.IntNumber.checkNum(IntNumber.java:12)
at com.chawaner.test3.Test.main(Test.java:18)
throws和throw的區別
| throws | throw |
|---|---|
| 用在方法宣告后,后面跟例外類名 | 用在方法體內,后面跟例外物件 |
| 拋出例外,由方法呼叫者處理 | 拋出例外,由方法內的陳述句處理 |
| 表示可能發生例外,但不一定會發生 | 執行throw時,一定拋出了例外 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/530547.html
標籤:其他
上一篇:淺談PHP設計模式的迭代器模式
