JAVA異常從認識到精通

從問題說起

那麼在項目開發中面對異常,我們遇到的問題有哪些呢?
在項目中的每一層如何處理異常?異常何時被拋出,何時被記錄?何時需要把checked Exception轉換成unchecked Exception?又何時需要把unchecked Exception轉換成checked Exception?異常是否應該呈現到前端頁面?

JAVA異常是什麼?

JAVA異常有什麼作用?

在面向過程的編程語言中,我們可以通過返回值來確定方法是否正確執行。比如返回1,表示執行成功;返回0,表示執行失敗。但是通過這種方式我們並不能確定錯誤的詳細信息。而且,對同一類錯誤,不同開發者對錯誤的處理方式也不一致。但是,在JAVA中採取了統一的處理機制——異常。它可以幫我們精確定位到程序出錯的源代碼位置,並獲取錯誤的堆棧信息。

在JAVA中,是如何具體處理異常的?

Java異常處理通過5個關鍵字來實現。try、catch、throw、throws、finally。具體的異常處理結構由try……catch……finally來實現。try語句塊放可能出現異常的Java代碼。catch用來捕獲可能發生的異常以及處理邏輯.Finally用來清除程序中未釋放的資源,不管try塊的代碼如何返回,finally塊總是會被執行。

JAVA異常體系結構

在這裏插入圖片描述
Throwable類是JAVA語言所有錯誤或異常的超類(兩個直接子類:Error和Exception)
Java程序在執行過程中所發生的異常事件可分爲兩類:
**Error:**Java虛擬機無法解決的嚴重問題。如:JVM系統內部錯誤、資源耗盡等嚴重情況。一般不編寫針對性的代碼進行處理。
**Exception:**其它因編程錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的代碼進行處理。例如:空指針訪問、試圖讀取不存 在的文件、網絡連接中斷。
**編譯時異常:**在編譯某個程序的時候有可能會有這樣那樣的事情發生,這樣的異常就必須在編譯的時候處理,如果不處理編譯通不過。(Java程序必須顯式處理,否則程序就會發生錯誤,無法通過編譯)
**運行時異常:**就是程序員所犯的錯誤,需要回來修改代碼(無需顯式處理,也可以和編譯時異常一起處理)

JAVA異常的優勢有哪些?

    public void test() {
        String driver = "com.mysql.jdbc.Driver";// URL指向要訪問的數據庫名test1
        String url = "jdbc:mysql://127.0.0.1:3306/test";// MySQL配置時的用戶名
        String user = "root";// Java連接MySQL配置時的密碼
        String password = "111";
        try {
            Class.forName(driver);// 1 加載驅動程序
            Connection conn = DriverManager.getConnection(url, user, password);// 2 連接數據庫
            Statement statement = conn.createStatement();// 3 用來執行SQL語句
            String sql = "select * from login";// 要執行的SQL語句
            ResultSet rs = statement.executeQuery(sql);
            String name = null;
            String mima = null;
            while (rs.next()) {
                name = rs.getString("userName");
                mima = rs.getString("passWord");
            }
            rs.close();
            conn.close();
        } catch (ClassNotFoundException e) {
            System.out.println("Sorry,can`t find the Driver!");
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

從代碼角度出發,可以看到異常與傳統返回值相比有以下好處:

  • 程序中的錯誤得到了統一的處理入口
  • 錯誤信息更詳細,編譯跟蹤與調試
  • 將正確執行結果與異常進行分類,降低了程序的複雜度
  • 強制調用者處理異常,增加了程序的健壯性。

編譯(checked)異常與運行期異常(unchecked)有什麼區別?

運行時異常(RuntimeException):
都是RuntimeException類及子類,如NullPointerException、IndexOutOfBounException
等, 這些異常不是檢查的異常, 是在程序運行的時候可能會發生的, 所以程序可以捕捉,也可以不捕捉,這些錯誤一般是由程序邏輯錯誤引起的, 程序應該從邏輯角度去儘量避免。

檢查異常(CheckedException)
是運行時異常以外的異常, 也是Exception及其子類, 這些異常從程序的角度來說是必須經過捕捉檢查處理的, 否則不能通過編譯. 如IOException、SQLException等

編譯(checked)異常的缺陷?

比如SQLException,如果一開始我們不在DAO層將該異常轉換爲運行期異常,那麼在service層、controller層都需要進行捕獲,這將導致大量重複的無用異常代碼出現在應用系統;另外,如果爲一個已有的接口添加一個編譯異常,那麼調用該接口的任何類都需修改,增加了程序維護的複雜性。
綜上所述,如果一個異常是致命的,不可恢復的。或者調用者去捕獲它也沒有任何益處,使用(unchecked)異常;如果一個異常是可以恢復的,可以被調用者正確處理,使用checked異常。在使用unchecked異常時,必須在方法聲明中詳細的說明該方法可能會拋出unchecked異常。由調用者自己決定是否捕獲unchecked異常。

異常如何處理的幾個建議?

  • 如果所有調用者必須處理這個異常,可以讓調用者進行重試操作;或者該異常相當於該方法的第二哥返回值,使用checked異常。
  • 這個異常只有少數的高級調用者可以處理,一般的調用者不能正確處理,使用unchecked異常。
  • 這個異常是一個非常嚴重的錯誤,如數據庫連接錯誤,文件無法打開等。或者是與外部環境相關的,不是重試可以解決的。使用unchecked異常。

https://max.book118.com/html/2017/0526/109283264.shtm

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