例外
- 一、例外概念引入
- 二、Throwable類
- 三、例外處理
- 1. try...catch..finally
- 2. throws
- 3.總結
- 四、Throwable的成員方法
- 1、getMessage——用于輸出例外的原因
- 2、toString——用于輸出例外的類名以及例外原因
- 3、printStackTrace——把例外資訊輸出
- 五、編譯例外與運行例外
- 六、自定義例外
- 七、throws和throw的區別
一、例外概念引入
package TEXT;
public class Demo {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
當我們執行以上java程式的時候,會發現出錯了

這個錯誤是一個非常簡單的錯誤,只是陣列索引出界
而這個也是一種例外,一種可以通過修改代碼修復的例外
ArrayIndexOutOfBoundsException
通過查詢幫助檔案
ArrayIndexOutOfBoundsException是繼承了例外類Throwable的類
在JAVA面向物件中,例外也是被封裝成了一個物件,這個物件繼承了Throwable類
那么官方術語例外是什么呢?
例外是指在程式運行中代碼產生的一種錯誤,
二、Throwable類
Throwable類是類別庫java.lang包中的一個類,它派生出兩個子類,Error類和Exception類
Error類代表了JAVA內部的錯誤或者某些硬體的錯誤,比如記憶體溢位錯誤,堆疊溢位錯誤,系統內部錯誤等等,不能通過修改代碼來實作解決該錯誤,
因此,Error類的錯誤被認為不能恢復的嚴重錯誤
所以,我們在寫代碼的時候,要盡量避免Error類的錯誤
而Exception類是用戶程式能夠捕捉到的例外情況,一般情況下,Exception類通過產生它的子類來創建自己例外,而這個例外可以通過修改代碼以達到修復該例外的作用
三、例外處理
1. try…catch…finally
try{
可能產生例外的代碼
}
catch(Exception e1){
對e1例外的處理
}
catch(Exception en){
對en例外的處理
}
finally{
一定會運行的陳述句序列
}

package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("開始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
// System.out.println("陣列索引出界");
e.printStackTrace();
}
System.out.println("結束");
}
}

用了這個處理例外之后,當程式遇上例外后,不再像以前那種直接退出程式而是可以繼續往下執行,這在我們以后開發軟體非常實用,我們開發出來的軟體,如果遇到例外后直接退出程式,那么將會給用戶不好的體驗,因此我們希望的是程式遇到例外可以往下執行,并且把例外報出來,
2. throws
try…catch…可以對例外進行處理,但是不是所有的情況我們都有權限進行例外的處理
也就是說,有些時候可能會出現我們處理不了的,這時候該怎么辦呢?
針對這種情況下,JAVA提供了throws的處理方法
格式:
throw 例外類名
注意 :這個格式時跟在方法的括號后面的
package TEXT;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo_1 {
public static void main(String[] args) {
System.out.println("開始");
method();
System.out.println("結束");
}
//運行時例外
public static void method() throws ArrayIndexOutOfBoundsException{
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}

通過這個這個的運行結果可以看出來,并沒有執行輸出”結束“,因此throws處理例外并不是真正處理例外而是只是把這個例外拋出了,如果想要繼續往下執行,那么需要對method繼續使用try…catch,所以這僅僅時延遲了例外
3.總結

四、Throwable的成員方法

1、getMessage——用于輸出例外的原因
package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("開始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
// System.out.println("陣列索引出界");
// e.printStackTrace();
System.out.println(e.getMessage());//例外的原因
}
System.out.println("結束");
}
}

2、toString——用于輸出例外的類名以及例外原因
package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("開始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
// System.out.println("陣列索引出界");
// e.printStackTrace();
// System.out.println(e.getMessage());//例外的原因
System.out.println(e.toString());//例外類名以及例外原因
}
System.out.println("結束");
}
}

3、printStackTrace——把例外資訊輸出
package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("開始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
// System.out.println("陣列索引出界");
e.printStackTrace();//把例外資訊輸出
// System.out.println(e.getMessage());//例外的原因
// System.out.println(e.toString());//例外類名以及例外原因
}
System.out.println("結束");
}
}

五、編譯例外與運行例外
JAVA中的例外被分為兩大類:編譯例外和運行例外,也被稱為受檢例外和非受檢例外
所有的RuntimeException類及其子類被稱為運行時例外,其他的例外都是編譯時例外
- 編譯時例外:必須顯示處理,否則程式就會發生錯誤,無法通過編譯
- 運行時例外:無需顯示處理,也可以和編譯時例外一樣處理
package TEXT;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo_1 {
public static void main(String[] args) {
method();
method2();
}
//運行時例外
public static void method(){
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}catch (Exception e){
e.printStackTrace();
}
}
//編譯時例外
public static void method2(){
try {
String s = "2020-09-01";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);//這里報錯只是為了說可能有例外
System.out.println(d);
}catch (ParseException e){
e.printStackTrace();
}
}
}

六、自定義例外
在我們撰寫程式的時候,會遇到各種各樣的例外,但是,并不是所有的例外都是JAVA實作封裝成物件的,因此自定義例外的作用就出來了,在自定義例外類中通過撰寫新的方法來處理相關例外
那么我們怎么創建屬于自己的例外呢?
我們只需要在建立例外的時候,繼承Exception或者RuntimeException即可

package TEXT_1;
/*
自定義分數例外
*/
public class ScoreException extends Exception{
public ScoreException() {
}
public ScoreException(String message) {
super(message);
}
}
package TEXT_1;
/*
老師物件類
*/
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("分數正常");
}
}
}
package TEXT_1;
/*
測驗類
*/
import java.util.Scanner;
public class TeacherTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入分數:");
int score = sc.nextInt();
Teacher t = new Teacher();
//checkScore方法拋出一個例外,而這個例外繼承的時Exception,所有這個時一個編譯時例外
try {
t.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}

七、throws和throw的區別

注意:拋出例外,不一定會有例外,當出現例外才會有例外
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297131.html
標籤:java

