一、Throwable
錯誤
異常
所有的異常都是由 Throwable 繼承而來, 在下一層分解爲 Error 和 Exception 兩個分支。 Error 類用於表示程序不試圖恢復的不可查嚴重錯誤的情況。 應用程序不應該拋出這種類型的對象。如果出現這種錯誤,我們只能把信息通知給用戶然後儘量安全地終止程序。程序一般不處理這類情況。
Exception 類是所有可查和不可查異常的父類。出現這種情況的時候最好不要中斷程序而是編寫代碼處理異常。
RuntimeException 類是用於由程序錯誤產生的不可查異常的父類, 它表示設計或實現中的問題,而程序本身編譯沒有問題。也就是說程序正確運行的話這種情況是不會出現的
二、異常
異常根類:Exception
異常產生及傳遞的機制及對代碼運行的影響
異常是在運行時可能產生,如果異常產生了,異常產生後的代碼終止運行。
虛擬機是如何處理異常:
當有異常產生時,虛擬機會創建一個異常對象,接着查看所在語句塊是否有異常處理機制,如果有,本地處理,如果沒有,查找上一層的調用者,如果上一層也沒有處理機制,會繼續拋到上一層,一直找到main方法爲止,如果main方法也沒處理,虛擬機直接關閉
異常處理機制
try,catch,finally
try
是必須要有的,當這個語句塊中產生異常時,異常之後的語句不會執行
catch
可以有多個語句塊,多個語句塊時,每個catch捕獲一種類型異常,父類型異常必須放在後面
當某種異常產生後,對應的語句塊纔會執行,如果沒有產生異常,所有的catch塊都不會運行
finally:不管是否有異常產生,這個語句塊中的代碼肯定會執行的
try,catch,finally可以如何組合:try...catch,try...catch...finally,try...finally
throw,throws
當一個異常本地不能處理時,需要系統統一處理,可以將它拋出
throw 拋出異常
throws 聲明拋出異常,標識這個方法會拋出哪些類型的異常,用在方法聲明中,告訴方法調用者要負責處理異常
try,catch,finally本地處理,開銷要小
throw開銷要大,但在開發過程中,通常底層產生異常後,應該由系統統一來處理,並給用戶返回合適的提醒、建議
異常分類
checked異常:如果一個異常強制要程序員來寫try...catch,或聲明拋出來處理,那麼它是checked異常
unchecked異常 :如果一個異常不強制程序員處理,就是unchecked異常,要定義unckecked異常,只需要繼承RuntimeException
自定義異常
最基本的要求是繼承Exception
三、異常快捷鍵
alt+shift+z
如果在一個方法內要求拋出多個異常,那麼在方法聲明後面使用 throws 子句,並且各
個異常使用“,”隔開:
public void reflect(Class cl) throws SecurityException,
NoSuchFieldException
如果在子類中覆蓋了一個父類拋異常的方法, 子類中聲明的可查異常不能超過父類方法聲明的異常範圍。 換句話說就是子類方法中拋出的異常只能是父類方法拋出異常相同的類或其子類,或者根本不拋出任何異常。如果父類方法沒有拋出任何可查異常,那麼子類的方法也不能拋出任何可查異常
值得注意的是,catch 子句的順序很重要,如果 catch 的多個異常有繼承關係,按代碼順序,先 catch 的異常的範圍要求比後 catch 的異常範圍小,也就是說,先 catch 的異常是後 catch 的異常的子類:
習慣上自定義異常類包括兩個構造器:一個默認構造器和一個帶有描述信息的構造器,
然後您可以自己定義一些必要的屬性和方法
要引發自己創建的異常只需要創建該異常的實例,然後使用 throw 語句即可