什么是异常?
java中異常也是一種類.?
異常: 不正常的情況
異常 :指的是程序在執(zhí)行過程中,出現(xiàn)的非正常的情況,最終會導致JVM的非正常停止。
?
常見的異常:
ArrayIndexOutOfBoundsException 數(shù)組索引越界異常
StringIndexOutOfBoundsException ?字符串索引越界異常
ArithmeticException ?除數(shù)不能為0的異常
NullPointerException ?空指針異常?
- Error:嚴重錯誤Error,無法通過處理的錯誤,只能事先避免,好比絕癥。
服務(wù)器宕機,數(shù)據(jù)庫奔潰
?
- Exception:表示異常,異常產(chǎn)生后程序員可以通過代碼的方式糾正,使程序繼續(xù)運行,是必須要處理的。好比感冒、闌尾炎。
?
異常的分類:
- 編譯時期異常:checked異常。在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)
編譯期間出現(xiàn)的異常,如果編譯期間不處理,那么程序無法執(zhí)行
除了RuntimeException及其子類,其他的異常都是編譯異常
?
- 運行時期異常:runtime異常。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數(shù)學異常)
只在運行期間出現(xiàn)的異常,如果編譯期間不處理,程序是可以執(zhí)行的,但是在執(zhí)行的時候會報出異常
只有RuntimeException及其子類都是運行異常
?
異常的產(chǎn)生過程解析
?
如何把產(chǎn)生的異常對象拋給調(diào)用者?
throw 用在方法內(nèi),用來拋出一個異常對象,將這個異常對象傳遞到調(diào)用者處,并結(jié)束當前方法的執(zhí)行。
?
格式:
throw new 異常類名(參數(shù));// throw 異常對象;
?
例子:
Objects非空判斷
public static <T> T requireNonNull(T obj):查看指定引用對象是不是null
?
如何處理異常?
處理異常的方式有2種:
聲明方式處理異常: 使用throws關(guān)鍵字聲明處理異常:將問題標識出來,報告給調(diào)用者
throws關(guān)鍵字運用于方法聲明之上,用于表示當前方法不處理異常,而是提醒該方法的調(diào)用者來處理異常(拋出異常).
格式:
修飾符 返回值類型 方法名(參數(shù)) throws 異常類名1,異常類名2…{
?
}
?
throws用于進行異常類的聲明,若該方法可能有多種異常情況產(chǎn)生,那么在throws后面可以寫多個異常類,用逗號隔開
或者直接在throws后面寫最大的異常(父類異常)
?
try-catch捕獲方式處理異常:
捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現(xiàn)的異常進行指定方式的處理。
?
格式:
try{
編寫可能會出現(xiàn)異常的代碼
}catch(異常類型 ?變量名){
處理異常的代碼
//記錄日志/打印異常信息/繼續(xù)拋出異常
}
?
1.如果try后面的大括號中的代碼出現(xiàn)了異常,那么catch就會捕獲到該異常對象,然后把該異常對象賦值給小括號中的異常類型的變量
,然后執(zhí)行catch后面的大括號中的代碼
2.如果try后面的大括號中的代碼沒有出現(xiàn)異常,那么catch就不會捕獲到異常對象,catch后面的大括號中的代碼就不會執(zhí)行
3.Throwable類中定義了一些查看方法:
- public String getMessage():獲取異常的描述信息,原因(提示給用戶的時候,就提示錯誤原因。
- public String toString():獲取異常的類型和異常描述信息(不用)。
- public void printStackTrace():打印異常的跟蹤棧信息并輸出到控制臺。
?
4.多個異常使用捕獲又該如何處理呢?
1. 多個異常分別處理。
2. 多個異常一次捕獲,多次處理。
3. 多個異常一次捕獲一次處理。
?
5.注意事項:
- 運行時異常被拋出可以不處理。即不捕獲也不聲明拋出。
- 如果父類拋出了多個異常,子類覆蓋父類方法時,只能拋出相同的異常或者是他的子集。
- 父類方法沒有拋出異常,子類覆蓋父類該方法時也不可拋出異常。此時子類產(chǎn)生該異常,只能捕獲處理,不能聲明拋出
- 當多異常處理時,捕獲處理,前邊的類不能是后邊類的父類
- 一旦try中的代碼發(fā)生了異常,那么try中發(fā)生異常的代碼后面的代碼就不會執(zhí)行了
?
6.finally 代碼塊
作用: finally代碼塊中的代碼無論異常是否發(fā)生,都需要執(zhí)行
注意:finally不能單獨使用。
?
格式:
try{
//可能會發(fā)生異常的代碼
?
}catch(異常的類型 變量名){
發(fā)生了異常之后會執(zhí)行的代碼
?
}finally{
正常情況下,無論是否發(fā)生異常,都會執(zhí)行的代碼
一般情況用來書寫釋放資源的代碼
}
?
注意事項:
- 在try/catch后可以追加finally代碼塊,其中的代碼一定會被執(zhí)行,通常用于資源回收。
- 如果finally有return語句,永遠返回finally中的結(jié)果,避免該情況.
?
什么是自定義異常類:
在開發(fā)中根據(jù)自己業(yè)務(wù)的異常情況來定義異常類.
?
異常類如何定義:
1. 自定義一個編譯期異常: 自定義類 并繼承于java.lang.Exception。
2. 自定義一個運行時期的異常類:自定義類 并繼承于java.lang.RuntimeException。
轉(zhuǎn)載于:https://www.cnblogs.com/woyaozilv/p/10599495.html
總結(jié)
- 上一篇: BZOJ - 4196 软件包管理器 (
- 下一篇: Django中发件邮箱的设定