1.異常的概念
簡單說就是不正常運行,最終導致JVM的非正常停止。
在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是創建異常對象并拋出了一個異常對象。Java處理異常的方式是中斷處理。
異常指的并不是語法錯誤,語法錯了,編譯不通過,不會產生字節碼文件,根本不能運行。
2.異常體系
異常機制其實是幫助我們找到程序中的問題,異常的根類是java.lang.Throwable,其下有兩個子類:java.lang.Error與java.lang.Exception,平常所說的異常指java.lang.Exception。
Throwable中的常用方法:
1、 public void printStackTrace():打印異常的詳細信息。
包含了異常的類型,異常的原因,還包括異常出現的位置,在開發和調試階段,都得使用printStackTrace。
2、 public String getMessage():獲取發生異常的原因。
提示給用戶的時候,就提示錯誤原因。
3、public String toString():獲取異常的類型和異常描述信息(不用)。
出現異常,最簡單的方式就是把異常的簡單類名,拷貝到API中去查。
3 .異常分類
我們平常說的異常就是指Exception,因為這類異常一旦出現,我們就要對代碼進行更正,修復程序。
異常(Exception)的分類:根據在編譯時期還是運行時期去檢查異常?
編譯時期異常:checked異常。在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)
運行時期異常:runtime異常。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數學異常)
編譯時異常和程序的上下文條件有著密切關系,即使程序設計無誤也會由于使用問題而引發。Java編譯器要求方法必須聲明拋出可能發生的編譯時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常
4.異常的處理
Java異常處理的五個關鍵字:try、catch、finally、throw、throws
4.1拋出異常throw
在編寫程序時,作為一個優秀的程序員必須要考慮程序出現問題的情況。舉個栗子,在定義方法時,方法需要接受參數。那么,當調用方法使用接受到的參數時,首先需要先對參數數據進行合法的判斷,數據若不合法,就應該告訴調用者,傳遞合法的數據進來。這時需要使用拋出異常的方式來告訴調用者。這個時候throw就派上用場了!
在java中,提供了一個throw關鍵字,Throw用來拋出一個指定的異常對象。從而可以
1、創建一個異常對象。封裝一些提示信息(信息可以自己編寫)。
2、通過關鍵字throw就可以將這個異常對象告知給調用者,還可以將這個異常對象傳遞到調用者處。
throw小結
throw用在方法內,后面接一個異常對象,使用格式為throw new 異常類名(參數);,將這個異常對象傳遞到調用者處,并結束當前方法的執行。
throw使用的格式如下:
throw new NullPointerException("要訪問的arr數組不存在")
throw new ArrayIndexOutOfBoundsException("該索引在數組中不存在,已超出范圍");
4.2聲明異常throws
如果產生了問題,我們就會throw將問題描述類即異常進行拋出,也就是將問題返回給該方法的調用者。
那么對于調用者來說,該怎么處理呢?一種是進行捕獲處理,另一種就是繼續講問題聲明出去,使用throws聲明處理。
聲明異常:將問題標識出來,報告給調用者。如果方法內通過throw拋出了編譯時異常,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進行聲明,讓調用者去處理。
throws小結
關鍵字throws運用于方法聲明之上,throws格式為修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2…{ },用于表示當前方法不處理異常,而是提醒該方法的調用者來處理異常(拋出異常).
4.3捕獲異常try…catch
如果異常出現的話,會立刻終止程序,所以我們得處理異常:
該方法不處理,而是聲明拋出,由該方法的調用者來處理(throws)。
在方法中使用try-catch的語句塊來處理異常。
try-catch的方式就是捕獲異常。
捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理。
捕獲異常語法如下:
try{編寫可能會出現異常的代碼
}catch(異常類型 e){處理異常的代碼//記錄日志/打印異常信息/繼續拋出異常
}
try:該代碼塊中編寫可能產生異常的代碼。
catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
注意:try和catch都不能單獨使用,必須連用。
4.4 finally 代碼塊
finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
什么時候的代碼必須最終執行?
當我們在try語句塊中打開了一些物理資源(磁盤文件/網絡連接/數據庫連接等),我們都得在使用完之后,最終關閉打開的資源。
finally的語法:
try…catch…finally:自身需要處理異常,最終還得關閉資源。
注意:finally不能單獨使用。
比如在IO流中,當打開了一個關聯文件的資源,最后程序不管結果如何,都需要把這個資源關閉掉。
當只有在try或者catch中調用退出JVM的相關方法,此時finally才不會執行,否則finally永遠會執行。
5.常見異常類型
異常 | 解釋 |
---|---|
NullPointerException | 空指針(即引用無具體指向)異常 |
ClassCastException | (強制)類型轉換錯誤 |
ArrayIndexOutOfBoundsException | 數組越界錯誤 |
UnsupportedClassVersionError | 運行JAVA版本不一致 |
NumberFormatException | 數字轉換異常 |
RuntimeException Java.lang | 包中多數異常的基類 |
ClassNotFoundException | 不能加載請求的類 |
IOException | I/O 異常的根類 |
FileNotFoundException | 不能找到文件 |
6.自定義異常
什么是自定義異常類:在開發中根據自己業務的異常情況來定義異常類.
自定義一個業務邏輯異常: RegisterException。一個注冊異常類。
異常類如何定義:
- 自定義一個編譯期異常: 自定義類 并繼承于java.lang.Exception。
- 自定義一個運行時期的異常類:自定義類 并繼承于java.lang.RuntimeException。