一、概述
我們在項目開發的過程中使用異常是必不可少的事情,那麼異常會帶來哪些好處呢?
我們知道異常帶來的最明顯的好處是,它能夠降低錯誤處理代碼的複雜度。不使用異常的話,我們就必須檢查一些特定的錯誤,並且在程序中許多地方都要去處理它。而當我們使用異常的時候,就不需要在方法的調用處進行檢查,因爲異常機制能夠捕獲到這個錯誤信息。然後我們只需要在一個地方處理這個錯誤。這種處理方式不僅能節省代碼量,而且還能把“描述在正常執行過程中做什麼事”的代碼(try)和“出了問題怎麼辦”的代碼(catch)之前進行分離。
總之,與之前處理錯誤的方法相比較,異常機制讓代碼可讀性更強,使編碼更有條理性,調試更加有序。
在程序員的開發過程中,由於程序員沒有考慮的十分周全,或者遺漏掉某些特定的場景,而會產生一系列的bug,如系統中存在的髒數據、打開並不存在的文件、進行相除運算分母爲0等情況。爲了能夠處理這些在程序運行過程中出現的錯誤,Java專門引入了異常類。
二、異常產生的原因及使用原則
異常產生的原因主要有三種情況,詳情如下:
1、Java內部錯誤發生異常(Java虛擬機發生了內部錯誤)。
2、編寫的程序代碼中產生的異常,例如空指針異常、類找不到異常、IO異常以及數組越界異常等。這種異常稱爲未檢査的異常,一般需要在代碼裏面處理這些異常。
3、通過throw語句拋出的異常,這種異常稱爲檢査的異常,一般用來告知該方法的調用者一些必要的信息。
Java是通過面向對象的方式來處理異常的。在該方法的運行過程中,一旦發生了異常,則該方法就會產生一個代表該異常的對象,並且把它交給運行時的系統,運行時系統尋找相應的代碼來處理這一異常。
我們把生成的異常對象提交給運行時系統的過程稱爲拋出異常即throw。運行時系統在方法的調用棧中查找,一直到能夠找到處理該類型異常對象的時候,這一個過程稱爲捕獲異常即catch。
Java異常會強制要求用戶去考慮程序的強健性以及安全性。如果將異常處理應用來控制程序的正常流程是不合理的,他的主要作用就是爲了捕獲程序運行過程中發生的異常並進行相應處理。
我們編寫代碼處理某個方法可能出現的異常,應該遵循以下三個原則:
1、在可能出現異常的方法中使用try catch語句來捕獲異常。
2、如果一個方法被覆蓋時,那麼覆蓋它的方法必須拋出相同的異常或異常的子類。
3、如果父類拋出多個異常時,那麼覆蓋方法必須拋出那些異常的一個子集,而不能拋出新的異常。
三、Java中常見的異常類型及體系結構圖
異常體系結構圖:
Java的異常主要分爲兩大類:
1、Checked異常
是編譯器在編譯時進行校驗的,通過throws語句或者try{}cathch{} 語句塊來處理檢測異常。編譯器會分析哪些異常會在執行一個方法或者構造函數的時候拋出。
2、Unchecked異常(運行時異常RuntimeException)
這種異常不需要編譯器來檢測。RuntimeException是所有可以在運行時拋出的異常的父類。一個方法除了要捕獲異常外,如果它執行的時候可能會拋出RuntimeException的子類,那麼它就不需要用throw語句來聲明拋出的異常。
舉個栗子,我們來看下面的這段代碼:
程序並沒有報錯,但是我們都知道0是不能當做被除數的,當我們運行的時候會報如下的錯
針對這樣的情況我們該如何處理呢,正確的處理方式是捕獲這個異常並處理,處理結果如下:
我們來運行這段代碼,結果如下:
類似像上面程序中出現的異常情況,就叫運行異常。運行異常一般都可以正常運行,只有在特定的場景下會發生異常。只要我們對運行異常類有一個清晰的認識,就能解決大多數程序上面的問題了。
原創聲明:本文爲【Java學習提升】原創博文,轉載請註明出處。
本文來源於公衆號:【Java學習提升】 專注於Java領域技術分享,Java知識體系學習、分享面試經驗,讓我們結伴而行,共同成長!