本文收錄在豬哥GitHub:https://github.com/pig6/Java 中,本項目收集一線大廠面試囚玫、實戰(zhàn)江兢、Java學(xué)習(xí)路線等昨忆。
一、異常產(chǎn)生的原理
JVM針對程序運行監(jiān)測出的異常創(chuàng)建個異常對象杉允,對象包含了異常產(chǎn)生的:內(nèi)容邑贴、原因席里、位置。根據(jù)程序邏輯將異常對象層層拋出或者處理拢驾。
二奖磁、Throwable體系
1.Error
錯誤Error一般是指java虛擬機相關(guān)的問題,如系統(tǒng)崩潰繁疤、虛擬機出錯誤署穗、動態(tài)鏈接失敗等,這種錯誤無法恢復(fù)或不可能捕獲嵌洼,將導(dǎo)致應(yīng)用程序中斷案疲,通常應(yīng)用程序無法處理這些錯誤,因此應(yīng)用程序不應(yīng)該捕獲Error對象麻养,也無須在其throws子句中聲明該方法拋出任何Error或其子類褐啡。
- VirtualMachineError
- OutOfMemoryError
- StackOverflowError
- LinkageError
- NoClassDefFoundError
- NoSuchMethodError
- 。鳖昌。备畦。
2.Exception
1> 運行時異常 RuntimeException:是指“可以避免的異常”许昨,如 null引用異常懂盐,這類異常都是由程序內(nèi)部原因造成的,是可以避免的糕档,考驗開發(fā)的嚴謹性莉恼,因此這個問題是我們作為一名開發(fā)必須要避免發(fā)生的,再大的公司每年總會有幾次事故是因為NPE導(dǎo)致的速那,我們?nèi)绻驗檫@種問題被通報了就是很尷尬的事情了(對生產(chǎn)環(huán)境一定要有足夠的敬畏心袄)。
常見的運行時異常有以下幾種:
- NullPointerException
- ClassCastExecption
- ArithmeticException
- IndexOutOfBoundsException
- ClassNotFoundException
2> 非運行時異常:代表“無法避免的異扯搜觯” 如io異常捶惜,往往這類異常是由于外部原因造成的,程序本身無法保證他們不發(fā)生荔烧,所以這類異常必須捕獲吱七,這就是我們在使用io資源或者操作線程比如sleep的時候必須要捕獲或者拋出的原因。
常見的有:
- IOException
- InterruptedException
- SQLException
-
自定義的非RuntimeException
3.Check And UnCheck
1>CheckedException:等價于非運行時異常鹤竭,要么捕獲踊餐,要么拋出,否則編譯無法通過诺擅。代表“無法避免的異呈行洌” 如io異常 往往這類異常是由于外部原因造成的,程序本身無法保證他們不發(fā)生
2>UnCheckedException:包括:Error&運行時異常
三、方法
- toString:異常類信息+異常信息描述
- getMessage:異常信息描述
- printStackTrace:最常用打印完整的錯誤堆棧信息
四苍碟、catch還是throw
通常應(yīng)該捕獲那些知道如何處理的異常酒觅,而將那些不知道如何處理的異常進行傳遞。如果想傳遞一個異常微峰,就必須在方法的聲明中添加一個throws說明符舷丹,以便告知調(diào)用者這個方法可能會拋出異常。
五蜓肆、finally
- 無論是否出現(xiàn)異常都會執(zhí)行
- 必須與try一起使用
- 注意:finally中有return語句永遠返回finally中的return颜凯,try塊中的return不會生效
六、其他
- 如果父類拋出了多個異常仗扬,子類重寫父類方法的時候症概,拋出和父類相同的異常//是父類異常的子類//或者不拋出
- 父類方法沒有拋出異常,子類重寫父類該方法的時候也不可以拋出異常早芭。此時子類產(chǎn)生該異常彼城,只能捕獲處理,不能聲明拋出
- 使用習(xí)慣:
- 不要丟棄異常退个,捕獲異常后需要進行相關(guān)處理募壕。如果用戶覺得不能很好地處理該異常,就讓它繼續(xù)傳播语盈,傳到別的地方去處理舱馅,或者把一個低級的異常轉(zhuǎn)換成應(yīng)用級的異常,重新拋出
- catch語句應(yīng)該指定具體的異常類型刀荒。不能把不該捕獲的異常也捕獲了
- 在finally里面釋放資源代嗤。如果finally里面也會拋出異常,也一樣需要使用try..catch處理
- 不要把大量的代碼塞在try...catch塊里面照棋,分離各個可能出現(xiàn)異常的語句并分別捕獲異常
遺留問題: 編碼中是該捕獲Exception還是Throwable呢资溃?歡迎評論區(qū)交流N漪帷烈炭!