一、異常分類
二、異常的聲明與拋出
1.異常的聲明
2.異常的拋出
三、異常的捕獲
1.捕獲異常--try-catch
2.捕獲多個異常--try-catch-catch-...
3.再次拋出異常
4.finally子句
一、異常分類異常對象都繼承自Throwable,
Error:描述了Java運行時系統的內部錯誤和資源耗盡錯誤。在應用程序代碼中不應該拋出這個類型的異常。
RuntimeException:由編程錯誤導致的異常
IOException:IO相關異常
Java語言規范將繼承Error類、RuntimeException類的所有異常稱為非檢查型異常。所有其他異常檢查型異常。
二、異常的聲明與拋出1.異常的聲明如果遇到了無法處理的情況,Java***可以聲明拋出一個異常。***不僅需要告訴編譯器將要返回什么值,還要告訴編譯器有可能發生什么錯誤。
以下是FileInputStream的一個真實示例:
//在文件存在時,返回一個文件輸入流,在文件不存在時,會拋出一個文件不存在異常
publicFileInputStream(Stringname)throwsFileNotFoundException{
...
}
聲明異常的場景:
調用了一個拋出檢查型異常的***,例如調用FileInputStream構造***。
檢測到一個錯誤,并且利用throw語句拋出一個非檢查型異常。
程序出現錯誤,如除零、數組越界異常的。
Java虛擬機或運行庫出現內部錯誤。
一個***聲明拋出多個異常:
publicImageloadImage(Stringpath)throwsFileNotFundException,EOFException{
...
}
不需要聲明從Error繼承的異常,任何代碼都可拋出那個異常,我們無法控制。
2.異常的拋出當遇到一些異常情況,無法繼續執行下去時,需要拋出異常。
//在***內部需要拋出異常時,需要在***首部聲明異常。
publicvoidmethod()throwsException{
...
thrownewException();
}
拋出異常的步驟:
找到一個合適的異常類
創建這個類的一個對象
將對象拋出
三、異常的捕獲1.捕獲異常–try-catch
要想捕獲一個異常,需要設計try/catch語句塊
try{
code
morecode
morecode
}catch(ExceptionTypee){
handlerforthistype
}
如果try語句塊中的任何代碼拋出了catch子句指定的一個異常類,那么:
程序將跳過try語句塊的其余代碼
程序將執行catch子句中的處理器代碼
如果try語句中的代碼沒有拋出異常,程序將跳過catch子句
如果***中的任何代碼拋出了catch中沒有聲明的異常類型,那么這個異常就不會被捕獲。
異常傳遞技巧:
要捕獲你能處理的異常
繼續傳播你不能處理的異常
要傳遞異常,就必須在***聲明異常
2.捕獲多個異常–try-catch-catch-…在一個try語句中可以捕獲多個異常類型,并對不同類型的異常做出不同的處理。要為每一個異常類型使用一個單獨的catch子句:
try{
...
}catch(FileNotFundExceptione){
handlercode
}catch(UnknowHostExceptione){
handlercode
}catch(IOExceptione){
handlercode
}
可使用e.getMessage()獲取異常描述信息
在Java7及以上版本,可使用同一catch子句中捕獲多個異常:
使用場景:當出現一種以上的異常,并且異常的處理流程相同時使用。
try{
...
}catch(FileNotFundException|UnknowHostExceptione){
//這里的異常變量e,隱式的被final修飾,不可修改。
handlercode
}catch(IOExceptione){
handlercode
}
3.再次拋出異常再次拋出異常:可以在catch中拋出一個異常,通常需要改變異常的類型時,需要這樣處理。
try{...}catch(Exceptione){thrownewRuntimeException(e.getMessage);}4.finally子句作用:不管是否有異常被捕獲,finally代碼塊,都將被執行,所以常用來釋放資源。
FileInputStreamin=newFileInputStream(...);
try{
morecode
}catch(IOExceptione){
exceptionhandlercode
}finally{
in.close();
}
執行情況分析:
未發生異常:先try后finally
發生異常,被捕獲:先try,發生異常時catch,
catch處理中出現異常,跳過catch后續處理,執行finally,并將異常返回給調用者。
catch處理中未出現異常,執行完catch代碼,最后執行finally
發生異常,未被捕獲:先try,后finally,并將異常返回給調用者。
注意不要再finally中使用return返回,會發生預想不到的錯誤。
5.try-with-Resources語句try代碼塊執行結束時,會自動調用close***,等同于自動釋放資源。
在try()中的資源類,必須實現AutoCloseable接口或Closeable的類,才可使用。
try(FileInputStreamfis=newFileInputStream(...)){
...
}