java學習之路:29.異常處理

在這裏插入圖片描述

一.異常概述

學習Java時,常常會遇到編譯程序後,提示出現異常,異常時一個在程序執行期間發生的事件,它中斷了正在執行的程序的正常指令流。
例如下面的代碼:

public class Exceptiontest {
    public static void main(String[] args) {
        int num=3/0; 
        System.out.println(num); 
    }
}

運行結果提示算術異常:
在這裏插入圖片描述
程序運行過程中發生了異常,系統不再執行下去,提前結束,這就是異常。
Java語言是一門面向對象的編程語言,因此,異常在Java語言中也是作爲類的實例的形式出現的。當某一方法中發生錯誤時,這個方法就會創建一個對象,並且把它傳遞給正在運行的系統,這個對象就是異常對象。通過異常處理機制,可以將非正常情況下的處理代碼與程序的主邏輯分離,即在編寫代碼主流程的同時在其他方法處理異常。
常見的異常如下。

二.常見異常

異常類 說明
ClassCastException 類型轉換異常
ClassNotFoundException 沒找到相應類異常
ArithmeticException 算術異常
ArrayIndexOutOfBoundsException 數組下標越界異常
ArrayStoreException 數組中包含不兼容的值拋出的異常
SQLException 操作數據庫異常類
NullPointerException 空指針異常
NoSuchFieldException 字段未找到異常
NoSuchMethodException 方法未找到拋出的異常
NumberFormatException 字符串轉換爲數字拋出的異常
NegativeArraySizeException 數組元素個數爲負數拋出的異常
StringIndexOutOfBoundsException 字符串索引超出範圍拋出的異常
IOException 輸入輸出異常
IllegalAccessException 不允許訪問某類異常
InstantiationException 當應用程序試圖使用Class類中的newInstance()方法創建一個類的實例,而指定的類對象無法被實例化時,拋出該異常。
EOFException 文件已結束異常
FileNotFoundException 文件未找到異常

三.捕捉異常

Java語言的異常捕捉結構由try,catch,finally三個部分構成,其中try語句塊中存的是可能發生異常的Java語句,catch程序塊在try語句塊之後,用來激發被捕捉的異常,finally語句塊是異常處理結構的最後執行部分,無論try語句塊中的代碼如何退出,都將執行finally語句塊,異常處理器大致分爲 try-catch 語句塊和 finally 語句塊。

1. try-catch 語句塊

將代碼稍稍改動:

public class Exceptiontest {
    public static void main(String[] args) {
        int num=3/0; 
        System.out.println(num); 
        System.out.println("繼續運行"); 
    }
}

運行可知,一旦出現異常會終止出現運行。
在這裏插入圖片描述
在添加了異常處理tyr-catch語句塊之後:

public class Exceptiontest { 
    public static void main(String[] args) {
    try {
        int num=3/0; 
        System.out.println(num); 
        }catch(Exception e) {
            e.printStackTrace();
        }     
    System.out.println("繼續運行"); 
    }
}

運行結果可以看出,程序仍然輸出最後的提示信息,沒有因爲異常而終止。
在這裏插入圖片描述

Exception是try代碼塊傳遞給catch代碼塊的變量類型,e是變量名,catch代碼塊中的語句“e.printStackTrace()方法用於指出異常的類型,性質,棧層次已經出現在程序中的位置。”另外兩個方法如下:
getMessage() : 輸出錯誤性質
toString() : 給出異常的類型與性質。

2.finally 語句塊

完整的異常處理語句一定要包含finally語句,無論程序中有無異常發生,並且無論之間的try-catch 語句塊是否順序執行完畢,都會執行finally語句。
在以下4種特殊情況下,finally塊不會被執行:

在finally語句中發生了異常
在前面的代碼中使用了System.exit()退出程序
程序所在的線程死亡
關閉CPU

四.自定義異常

除了內置的異常類,用戶也可以自定義異常,只需要繼承Exception類即可。
步驟如下:
1.創建自定義異常類。
2.在方法中通過throw關鍵字拋出異常對象。

3.如果在當前拋出異常的方法中處理異常,可以使用try-catch語句塊捕捉並處理,否則在方法的聲明處通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作。

4.在出現異常的調用者中捕捉並處理異常。

例如:

//創建自定義異常類
class MyException extends Exception{
    public MyException(String ErrorMessage) {
    super(ErrorMessage); 
    }
}

//在方法中通過throw關鍵字拋出異常對象

public class Exceptiontest {
    static int avg(int number1,int number2) throws MyException{
    if (number1 < 0 || number2 < 0) {
        throw new MyException("不可以使用負數"); 
    }
    if (number1 > 100 || number2 > 100) {
        throw new MyException("數值太大了"); 
    }
    return (number1 + number2); 
    }
    public static void main(String[] args) {
        try {
            int num =avg(155,155); 
            System.out.print(num); 
        }catch(MyException e) {
         System.out.println(e);
        } 
    }
}

運行結果:
在這裏插入圖片描述

五.在方法中拋出異常

1.使用throws關鍵字拋出異常

throws 關鍵字通常被應用在聲明方法時,用來指定方法可能拋出的異常,多個異常可使用逗號分隔。
如:

int avg(int number1,int number2) throws MyException{
//   。。。。。。
}

使用throws關鍵字將異常拋給上一級後,如果不想處理該異常,可以繼續向上拋出,但最終要有能夠處理該異常的代碼。

2.使用throw關鍵字拋出異常

throw關鍵字通常用於方法體中,並且拋出一個異常對象。程序在執行到throw語句時立即終止,他後面的語句都不執行。通過throw拋出異常後,如果想在上一級代碼中來捕獲並處理異常,則需要在拋出異常的方法中使用throws關鍵字在方法的聲明中指名要拋出的異常,如果要捕捉throw拋出異常,則必須使用try-catch語句塊。
如:

if (number1 < 0 || number2 < 0) {
         throw new MyException("不可以使用負數"); 
     }

若有錯誤,歡迎指正批評,歡迎批評。
每文一句:生活不能等別人來安排,要自已去爭取和奮鬥;而不論其結果是喜是悲,但可以慰藉的是,你總不枉在這世界上活了一場。——路遙《平凡的世界》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章