Java常見踩坑記錄之異常處理
一、Java異常類層次結(jié)構(gòu)
Java中,所有的異常都來(lái)源于java.lang包中的Throwable類,它有兩個(gè)重要的子類,Exception(異常)和Error(錯(cuò)誤)。
- Exception :程序本身可以處理的異常,可以通過(guò) catch 來(lái)進(jìn)行捕獲。Exception 又可以分為 受檢查異常(必須處理) 和 不受檢查異常(可以不處理)。
- Error :Error 屬于程序無(wú)法處理的錯(cuò)誤 ,我們沒辦法通過(guò) catch 來(lái)進(jìn)行捕獲 。例如,虛擬機(jī)內(nèi)存不夠錯(cuò)誤(OutOfMemoryError)、類定義錯(cuò)誤(NoClassDefFoundError)等 。這些異常發(fā)生時(shí),Java 虛擬機(jī)(JVM)一般會(huì)線程終止。
二、Throwable類常用方法
- public String getMessage(): 返回異常發(fā)生時(shí)的簡(jiǎn)要描述
- public String toString(): 返回異常發(fā)生時(shí)的詳細(xì)信息
- public String getLocalizedMessage():返回異常對(duì)象的本地化信息。使用 Throwable 的子類覆蓋這個(gè)方法,可以生成本地化信息。如果子類沒有覆蓋該方法,則該方法返回的信息與 getMessage()返回的結(jié)果相同
- public void printStackTrace():在控制臺(tái)上打印 Throwable 對(duì)象封裝的異常信息
三、try-catch-finally
- try塊: 用于捕獲異常。其后可接零個(gè)或多個(gè) catch 塊,如果沒有 catch 塊,則必須跟一個(gè) finally 塊。
- catch塊: 用于處理 try 捕獲到的異常。
- finally 塊: 無(wú)論是否捕獲或處理異常,finally 塊里的語(yǔ)句都會(huì)被執(zhí)行。當(dāng)在 try 塊或 catch 塊中遇到 return 語(yǔ)句時(shí),finally 語(yǔ)句塊將在方法返回之前被執(zhí)行。
在以下 2種特殊情況下,finally 塊不會(huì)被執(zhí)行:
- 在 try 或 finally塊中用了 System.exit(int)退出程序。但是,如果 System.exit(int) 在異常語(yǔ)句之后,finally 還是會(huì)被執(zhí)行
- 程序所在的線程死亡。
代碼示例:
BufferedReader br = null; try { br = new BufferedReader(new FileReader("test.txt")); br.readLine(); } catch (Exception e) { e.printStackTrace(); } finally { if (br != null) try { br.close(); } catch (IOException e) { e.printStackTrace(); } }
四、使用 try-with-resources 來(lái)代替try-catch-finally
1. 適用范圍(資源的定義): 任何實(shí)現(xiàn) java.lang.AutoCloseable
的對(duì)象
2. 關(guān)閉資源和 finally 塊的執(zhí)行順序: 在 try-with-resources
語(yǔ)句中,任何 catch 或 finally 塊在聲明的資源關(guān)閉后運(yùn)行
《Effecitve Java》中明確指出:
面對(duì)必須要關(guān)閉的資源,我們總是應(yīng)該優(yōu)先使用 try-with-resources 而不是try-finally。隨之產(chǎn)生的代碼更簡(jiǎn)短,更清晰,產(chǎn)生的異常對(duì)我們也更有用。try-with-resources語(yǔ)句讓我們更容易編寫必須要關(guān)閉的資源的代碼,若采用try-finally則幾乎做不到這點(diǎn)。
將上面的代碼例子改造:
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { br.readLine(); } catch (Exception e) { e.printStackTrace(); }
代碼變得非常簡(jiǎn)潔。
注意:try-with-resource中聲明的變量會(huì)隱式的加上final 關(guān)鍵字,所以無(wú)法再進(jìn)行賦值。
五、自定義異常
在Java中要想創(chuàng)建自定義異常,需要繼承Throwable或者他的子類Exception。
因?yàn)楦割愐呀?jīng)把異常信息的操作都完成了,所在子類只要在構(gòu)造時(shí),將異常信息傳遞給父類通過(guò)super 語(yǔ)句即可。
代碼示例:
public class CustomException extends Exception { //無(wú)參構(gòu)造方法 public CustomException(){ super(); } //有參的構(gòu)造方法 public CustomException(String message){ super(message); } // 用指定的詳細(xì)信息和原因構(gòu)造一個(gè)新的異常 public CustomException(String message, Throwable cause){ super(message,cause); } //用指定原因構(gòu)造一個(gè)新的異常 public CustomException(Throwable cause) { super(cause); } }
按照國(guó)際慣例,自定義的異常應(yīng)該總是包含如下的構(gòu)造函數(shù):
- 一個(gè)無(wú)參構(gòu)造函數(shù)
- 一個(gè)帶有String參數(shù)的構(gòu)造函數(shù),并傳遞給父類的構(gòu)造函數(shù)。
- 一個(gè)帶有String參數(shù)和Throwable參數(shù),并都傳遞給父類構(gòu)造函數(shù)
- 一個(gè)帶有Throwable 參數(shù)的構(gòu)造函數(shù),并傳遞給父類的構(gòu)造函數(shù)。
finally塊和return
首先一個(gè)不容易理解的事實(shí):在 try塊中即便有return,break,continue等改變執(zhí)行流的語(yǔ)句,finally也會(huì)執(zhí)行。
finally中的return 會(huì)覆蓋 try 或者catch中的返回值。
finally中的return或異常會(huì)抑制(消滅)前面try或者catch塊中的異常。
總結(jié)
到此這篇關(guān)于Java常見踩坑記錄之異常處理的文章就介紹到這了,更多相關(guān)Java常見異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中List對(duì)象列表實(shí)現(xiàn)去重或取出及排序的方法
這篇文章主要介紹了關(guān)于java中List對(duì)象列表實(shí)現(xiàn)去重或取出以及排序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08spring cloud整合ribbon問(wèn)題及解決方案
很多小伙伴在整合ribbon都出了相同的問(wèn)題,今天特地為大家整理了該問(wèn)題的解決方案,文中有非常詳細(xì)的圖文解說(shuō),對(duì)出現(xiàn)同樣問(wèn)題的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05學(xué)習(xí)Java之二叉樹的編碼實(shí)現(xiàn)過(guò)程詳解
本文將通過(guò)代碼來(lái)進(jìn)行二叉樹的編碼實(shí)現(xiàn),文中的代碼示例介紹的非常詳細(xì),對(duì)我們學(xué)習(xí)Java二叉樹有一定的幫助,感興趣的同學(xué)跟著小編一起來(lái)看看吧2023-08-08如何解決EasyExcel導(dǎo)出文件LocalDateTime報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了如何解決EasyExcel導(dǎo)出文件LocalDateTime報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06JFreeChart插件實(shí)現(xiàn)的折線圖效果實(shí)例
這篇文章主要介紹了JFreeChart插件實(shí)現(xiàn)的折線圖效果,結(jié)合實(shí)例形式分析了基于JFreeChart繪制折線圖的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08java迭代器基礎(chǔ)知識(shí)點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于java迭代器基礎(chǔ)知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-01-01