为什么要在Java中使用Unchecked异常而不是Checked异常
生活随笔
收集整理的這篇文章主要介紹了
为什么要在Java中使用Unchecked异常而不是Checked异常
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
關(guān)于檢查與未檢查的異常的爭論可以追溯到過去。 有人說這是Java包含的最佳功能之一。 其他人則說這是他們最大的錯(cuò)誤之一[ 1 ]。
辯論似乎結(jié)束了。 在這篇文章中,我將嘗試包含指向該主題的文章和書籍的鏈接。 我不是專家,但是我會(huì)盡力向您解釋為什么我得出這個(gè)結(jié)論。
所以,我們正在談?wù)?#xff0c;
未經(jīng)檢查的異常:
我敢肯定,我們大多數(shù)人都知道檢查和未檢查異常之間的區(qū)別,但是很少有人在使用它們之前會(huì)仔細(xì)考慮。 我希望所有詳細(xì)信息都在單個(gè)頁面中列出,以便說服我的團(tuán)隊(duì)切換到“未經(jīng)檢查的異?!?。
羅伯特·C·馬丁(Robert C. Martin)在他著名的《 干凈的代碼:敏捷軟件技巧手冊(cè)》 [ 3 ]中寫下了以下幾行,以支持未檢查的異常。
辯論結(jié)束了。 多年來,Java程序員一直在爭論 檢查異常 的好處和責(zé)任 。 在 Java 的第一個(gè)版本中引入檢查異常時(shí) ,它們似乎是一個(gè)好主意。 每個(gè)方法的簽名將列出 它可以傳遞給調(diào)用方的 所有 異常。 而且,這些異常是該類型的一部分 該方法。 如果簽名與您的 代碼 不匹配,則您的 代碼 將無法編譯 。
當(dāng)時(shí),我們認(rèn)為檢查異常是個(gè)好主意; 是的,它們可以 帶來一些好處。 但是,現(xiàn)在很明顯,對(duì)于 強(qiáng)大的軟件來說 ,它們不是必需的 。 C#沒有檢查異常,盡管嘗試了各種英勇的嘗試,C ++ 也沒有。 Python或Ruby都沒有。 但是有可能用所有 這些語言 編寫健壯的軟件 。 因?yàn)槭沁@種情況,所以我們必須(真的)決定是否應(yīng)該檢查 異常。
如果您正在編寫關(guān)鍵庫,則檢查異常有時(shí)會(huì)很有用:您 必須捕獲它們。 但是在一般應(yīng)用程序開發(fā)中,依賴項(xiàng)成本大于 收益
最后一行是最重要的,他談到了一般的應(yīng)用程序開發(fā),讓我們舉個(gè)例子, 如果必須使用DOM解析器讀取XML文件,則需要處理一些經(jīng)過檢查的異常[ 5 ],例如ParserConfigurationException,SAXException和IOException。 API開發(fā)人員認(rèn)為,如果XML無效,則應(yīng)通知他們,以便API的使用者(即應(yīng)用程序開發(fā)人員)可以決定如何處理這種情況。
現(xiàn)在,如果您有其他選擇來進(jìn)行常規(guī)邏輯操作,則可以這樣做,否則,應(yīng)該捕獲這些已檢查的異常并拋出和未檢查的異常。 這樣,方法簽名也將很干凈,我們指出如果XML無效,我們將無法做很多事情,并且我們將停止處理。 讓寫在頂層的錯(cuò)誤處理程序?qū)ψ鍪裁醋龀鲞m當(dāng)?shù)臎Q定。
因此,我們需要做的就是通過擴(kuò)展RuntimeException來創(chuàng)建自定義異常類。
在Oracle托管的Java教程中,有一個(gè)關(guān)于該辯論的有趣頁面[ 4 ],該頁面以該行結(jié)尾。 如果可以合理地期望客戶端從異常中恢復(fù),請(qǐng)將其設(shè)置為已檢查的異常。 如果客戶端無法采取任何措施來從異常中恢復(fù),請(qǐng)將其設(shè)置為未經(jīng)檢查的異常。
辯論似乎結(jié)束了。 在這篇文章中,我將嘗試包含指向該主題的文章和書籍的鏈接。 我不是專家,但是我會(huì)盡力向您解釋為什么我得出這個(gè)結(jié)論。
所以,我們正在談?wù)?#xff0c;
未經(jīng)檢查的異常:
- 表示程序中的缺陷(錯(cuò)誤)–通常將無效參數(shù)傳遞給非私有方法。 引用Gosling,Arnold和Holmes的《 Java編程語言》:“未經(jīng)檢查的運(yùn)行時(shí)異常表示的條件通常可以反映程序邏輯中的錯(cuò)誤,并且無法在運(yùn)行時(shí)合理地恢復(fù)?!?/span>
- 是RuntimeException的子類,通常使用IllegalArgumentException,NullPointerException或IllegalStateException實(shí)現(xiàn)
- 一個(gè)方法沒有義務(wù)為由其實(shí)現(xiàn)引發(fā)的未經(jīng)檢查的異常建立策略(并且它們幾乎總是不這樣做)
- 表示程序無法直接控制的區(qū)域中的無效條件(無效的用戶輸入,數(shù)據(jù)庫問題,網(wǎng)絡(luò)中斷,文件缺失)
- 是Exception的子類
- 一個(gè)方法必須為由其實(shí)現(xiàn)拋出的所有檢查的異常建立一個(gè)策略(將檢查的異常進(jìn)一步傳遞到堆棧中,或以某種方式進(jìn)行處理)
我敢肯定,我們大多數(shù)人都知道檢查和未檢查異常之間的區(qū)別,但是很少有人在使用它們之前會(huì)仔細(xì)考慮。 我希望所有詳細(xì)信息都在單個(gè)頁面中列出,以便說服我的團(tuán)隊(duì)切換到“未經(jīng)檢查的異?!?。
羅伯特·C·馬丁(Robert C. Martin)在他著名的《 干凈的代碼:敏捷軟件技巧手冊(cè)》 [ 3 ]中寫下了以下幾行,以支持未檢查的異常。
辯論結(jié)束了。 多年來,Java程序員一直在爭論 檢查異常 的好處和責(zé)任 。 在 Java 的第一個(gè)版本中引入檢查異常時(shí) ,它們似乎是一個(gè)好主意。 每個(gè)方法的簽名將列出 它可以傳遞給調(diào)用方的 所有 異常。 而且,這些異常是該類型的一部分 該方法。 如果簽名與您的 代碼 不匹配,則您的 代碼 將無法編譯 。
當(dāng)時(shí),我們認(rèn)為檢查異常是個(gè)好主意; 是的,它們可以 帶來一些好處。 但是,現(xiàn)在很明顯,對(duì)于 強(qiáng)大的軟件來說 ,它們不是必需的 。 C#沒有檢查異常,盡管嘗試了各種英勇的嘗試,C ++ 也沒有。 Python或Ruby都沒有。 但是有可能用所有 這些語言 編寫健壯的軟件 。 因?yàn)槭沁@種情況,所以我們必須(真的)決定是否應(yīng)該檢查 異常。
如果您正在編寫關(guān)鍵庫,則檢查異常有時(shí)會(huì)很有用:您 必須捕獲它們。 但是在一般應(yīng)用程序開發(fā)中,依賴項(xiàng)成本大于 收益
最后一行是最重要的,他談到了一般的應(yīng)用程序開發(fā),讓我們舉個(gè)例子, 如果必須使用DOM解析器讀取XML文件,則需要處理一些經(jīng)過檢查的異常[ 5 ],例如ParserConfigurationException,SAXException和IOException。 API開發(fā)人員認(rèn)為,如果XML無效,則應(yīng)通知他們,以便API的使用者(即應(yīng)用程序開發(fā)人員)可以決定如何處理這種情況。
現(xiàn)在,如果您有其他選擇來進(jìn)行常規(guī)邏輯操作,則可以這樣做,否則,應(yīng)該捕獲這些已檢查的異常并拋出和未檢查的異常。 這樣,方法簽名也將很干凈,我們指出如果XML無效,我們將無法做很多事情,并且我們將停止處理。 讓寫在頂層的錯(cuò)誤處理程序?qū)ψ鍪裁醋龀鲞m當(dāng)?shù)臎Q定。
因此,我們需要做的就是通過擴(kuò)展RuntimeException來創(chuàng)建自定義異常類。
在Oracle托管的Java教程中,有一個(gè)關(guān)于該辯論的有趣頁面[ 4 ],該頁面以該行結(jié)尾。 如果可以合理地期望客戶端從異常中恢復(fù),請(qǐng)將其設(shè)置為已檢查的異常。 如果客戶端無法采取任何措施來從異常中恢復(fù),請(qǐng)將其設(shè)置為未經(jīng)檢查的異常。
我也發(fā)現(xiàn)很少文章支持這一點(diǎn),
霍華德·劉易斯·希普的檢查異常的悲劇
杰德·衛(wèi)斯理·史密斯(Jed Wesley-Smith) 是個(gè)例外
例外檢查我愛你,但你得走了 Misko Hevery
另外,很少有文章介紹一般的最佳最佳實(shí)踐,
Vineet Reynolds 處理異常的準(zhǔn)則
異常處理反模式作者:Tim McCune
杰出實(shí)踐,作者Brian Goetz 異常處理的最佳實(shí)踐作者:Gunjan Doshi
參考: 為什么我們的JCG合作伙伴 會(huì)使用Unchecked異常而不是Java中的Checked異常 ? 面向?qū)ο蟮纳畈┛椭械腗anu PK。
翻譯自: https://www.javacodegeeks.com/2012/03/why-should-you-use-unchecked-exceptions.html
總結(jié)
以上是生活随笔為你收集整理的为什么要在Java中使用Unchecked异常而不是Checked异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “功能追上 Windows”,腾讯 QQ
- 下一篇: 小岛惊魂剧情解析 剧情分析