異常是程序運行過程中出現的錯誤。Java 把異常當作對象來處理,把異常信息封裝成了一個類,并定義一個基類
java.lang.Throwable
作為所有異常的超類。Throwable : 它是所有錯誤與異常的超類(祖宗類),有兩個子類Error
和Exception
。~
本篇主要記錄內容包括:異常介紹、拋出異常、聲明異常、捕獲異常
- 上一篇內容:Java基礎:Java抽象接口
- 下一篇內容:Java集合:概述
- 更多知識學習:全網最全的 Java 技術棧內容梳理(持續更新中)
文章目錄
- 一、異常介紹
- 1、異常繼承體系
- 2、運行時期異常&編譯時異常
- 3、發生異常到時候,程序的執行特征
- 4、異常與錯誤的區別
- 5、異常在方法重寫中細節
- 二、拋出異常、聲明異常
- 1、拋出異常 throw
- 2、聲明異常 throws
- 3、自定義異常
- 4、Throwable類中的常用方法
- 三、捕獲異常
- 1、try…catch…finally
- 2、異常處理流程
- 3、try…catch…finally 異常處理的組合方式
一、異常介紹
1、異常繼承體系
異常是程序運行過程中出現的錯誤。Java 把異常當作對象來處理,把異常信息封裝成了一個類,并定義一個基類java.lang.Throwable
作為所有異常的超類
- Throwable : 它是所有錯誤與異常的超類(祖宗類),有兩個子類
Error
和Exception
- Error : 錯誤,程序無法處理的錯誤,比如
OutOfMemoryError
、ThreadDeath
等。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。 - Exception : 異常,程序本身可以處理的異常,程序中應當盡可能去處理這些異常。
RuntimeException
: 運行期異常,JAVA程序運行過程中出現的問題,可以通過java虛擬機來自行處理CheckableException
: 編譯時異常或者可檢查異常,我們應該捕獲或者拋出,try…catch。
2、運行時期異常&編譯時異常
- 運行時期異常:方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常,運行時期異常一旦發生,需要程序人員修改源代碼;
- 編譯時異常: 必須在編譯前處理,否則無法通過編譯
3、發生異常到時候,程序的執行特征
- 我們的代碼,從發生異常的地方,開始被一分為二
- 在異常發生之前的代碼,都可以正常運行,之后的代碼不會執行
- 當異常發生的時候,這個異常被
jvm
所捕獲,并將這個異常的所有相關信息,創建為一個異常對象,然后將該異常對象的信息輸出到控制臺(執行的是虛擬機默認的異常處理代碼) - 終止當前程序
4、異常與錯誤的區別
- 異常:指程序在編譯、運行期間發生了某種異常(
XxxException
),我們可以對異常進行具體的處理。若不處理異常,程序將會結束運行。 - 錯誤:指程序在運行期間發生了某種錯誤(
XxxError
,Error
錯誤通常沒有具體的處理方式,程序將會結束運行。Error
錯誤的發生往往都是系統級別的問題,都是jvm
所在系統發生并反饋給jvm
的。我們無法針對處理,只能修正代碼。
5、異常在方法重寫中細節
- 子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明;
- 當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集
二、拋出異常、聲明異常
1、拋出異常 throw
在 java 中,提供了一個throw關鍵字,它用來拋出一個指定的(Throwable類型)異常對象,一般會用于程序出現某種邏輯時,程序員主動拋出某種特定類型的異常
使用格式:throw new 異常類名(參數);
具體步驟:
- 創建一個異常對象, 封裝一些提示信息(信息可以自己編寫).
- 通過關鍵字
throw
,將這個異常對象告知給調用者. throw
用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,并結束當前方法的執行
注意事項:
- 如果拋出的異常對象屬于可檢查的異常,必須在該方法頭部,聲明拋出此異常, 即: throws 要拋出的異常類型;
- 其次,對于拋出可檢查的異常,還必須與方法的異常列表中的異常兼容;
- 如果父類方法聲明了異常列表:子類可以不聲明異常列表,子類方法有自己異常列表時,必須保證,子類的異常列表所包含的異常類型,與父類中所包含的異常類型兼容
2、聲明異常 throws
將問題標識出來,報告給調用者
throws
是方法可能拋出異常的聲明, 如果定義功能時有問題發生需要報告給調用者。可以通過在方法上使用throws
關鍵字進行聲明。
對于聲明了會拋出可檢查異常的方法, 就意味著這個方法會產生可檢查異常,所以,一旦調用該方法就必須對該方法做異常處理
在throws
后面可以寫多個異常類,用逗號隔開
聲明異常格式:修飾符 返回值類型 方法名(參數) throws <異常列表> { }
3、自定義異常
如果Java沒有提供你需要的異常,則可以自定義異常類
編譯時異常繼承Exception
,運行時異常繼承RuntimeException
格式:
Class 異常名 extends Exception{ //或繼承RuntimeExceptionpublic 異常名(){}public 異常名(String s){super(s);}
}
4、Throwable類中的常用方法
getCause()
:返回拋出異常的原因,即異常提示信息。如果 cause 不存在或未知,則返回 null;getMessage()
:返回異常的消息信息,即該異常的名稱與詳細信息字符串;printStackTrace()
:在控制臺輸出該異常的名稱與詳細信息字符串、異常出現的代碼位置
三、捕獲異常
1、try…catch…finally
Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理
捕獲異常格式:
try {//需要被檢測的語句。
}
catch(異常類 e) { //try中拋出的是什么異常,在括號中就定義什么異常類型。//異常的處理語句。
}
finally {//一定會被執行的語句。
}
//try:該代碼塊中編寫可能產生異常的代碼。
//catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
//finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
2、異常處理流程
- 首先,當異常在
try*
代碼塊中發生的時候,虛擬機首先捕獲這個異常,創建一個異常對象(包含本次異常的所有詳細信息); - 虛擬機會把這個異常,拋出給
catch
代碼塊(類似于方法調用,虛擬機會調用catch代碼塊中,處理異常的代碼); - 執行
catch
代碼塊,中的處理異常的代碼; - 沒有終止我們應用程序,而是從
catch
語句之后的代碼開始,繼續執行我們的應用程序
3、try…catch…finally 異常處理的組合方式
try catch finally
組合: 檢測異常,并傳遞給catch
處理,并在finally
中進行資源釋放;try catch
組合 : 對代碼進行異常檢測,并對檢測的異常傳遞給catch
處理。對異常進行捕獲處理;- 多個
try catch
組合 當可能有多種類型的異常發生的時候,我把可能產生某異常類型的代碼分開,分別放在不同的try-catch
代碼塊中; - 一個
try
多個catch
組合: 對代碼進行異常檢測,并對檢測的異常傳遞給catch
處理,對每種異常信息進行不同的捕獲處理; try finally
組合: 對代碼進行異常檢測,檢測到異常后因為沒有catch
,所以一樣會被默認jvm
拋出,異常是沒有捕獲處理的。但是功能所開啟資源需要進行關閉,所以finally
只為關閉資源