最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程中的檢查型異常與非檢查型異常分析

 更新時間:2017年09月08日 14:46:38   作者:swpihchj  
這篇文章主要介紹了Java編程中的未檢查型異常與非檢查型異常,以及異常的處理方式,需要的朋友可以參考下

        對于因為編程錯誤而導(dǎo)致的異常,或者是不能期望程序捕獲的異常(解除引用一個空指針,數(shù)組越界,除零,等等),為了使開發(fā)人員免于處理這些異常,一些異常被命名為非檢查型異常(即那些繼承自 RuntimeException 的異常)并且不需要進行聲明。

Checked Exception和Unchecked Exception的幾點不同之處
        方法簽名是否需要聲明exception,調(diào)用該方法時是否需要捕獲exception,exception產(chǎn)生的時候JVM控制程序的狀態(tài)。

Sun 的“The Java Tutorial”觀點
        因為 Java 語言并不要求方法捕獲或者指定運行時異常,因此編寫只拋出運行時異常的代碼或者使得他們的所有異常子類都繼承自RuntimeException ,對于程序員來說是有吸引力的。這些編程捷徑都允許程序員編寫 Java 代碼而不會受到來自編譯器的所有挑剔性錯誤的干擾,并且不用去指定或者捕獲任何異常。盡管對于程序員來說這似乎比較方便,但是它回避了 Java 的捕獲或者指定要求的意圖,并且對于那些使用您提供的類的程序員可能會導(dǎo)致問題。

        檢查型異常代表關(guān)于一個合法指定的請求的操作的有用信息,調(diào)用者可能已經(jīng)對該操作沒有控制,并且調(diào)用者需要得到有關(guān)的通知 —— 例如,文件系統(tǒng)已滿,或者遠端已經(jīng)關(guān)閉連接,或者訪問權(quán)限不允許該動作。

        如果您僅僅是因為不想指定異常而拋出一個 RuntimeException ,或者創(chuàng)建RuntimeException 的一個子類,那么您換取到了什么呢?您只是獲得了拋出一個異常而不用您指定這樣做的能力。換句話說,這是一種用于避免文檔化方法所能拋出的異常的方式。在什么時候這是有益的?也就是說,在什么時候避免注明一個方法的行為是有益的?答案是“幾乎從不?!?br />

        換句話說,Sun 告訴我們檢查型異常應(yīng)該是準則。該教程通過多種方式繼續(xù)說明,通常應(yīng)該拋出異常,而不是 RuntimeException —— 除非您是 JVM。

        在 Effective Java: Programming Language Guide一書中(請參閱參考資料),Josh Bloch 提供了下列關(guān)于檢查型和非檢查型異常的知識點,這些與 “The Java Tutorial” 中的建議相一致(但是并不完全嚴格一致):

第 39 條:只為異常條件使用異常。也就是說,不要為控制流使用異常,比如,在調(diào)用 Iterator.next() 時而不是在第一次檢查Iterator.hasNext() 時捕獲NoSuchElementException 。

第 40 條:為可恢復(fù)的條件使用檢查型異常,為編程錯誤使用運行時異常。這里,Bloch 回應(yīng)傳統(tǒng)的 Sun 觀點 —— 運行時異常應(yīng)該只是用于指示編程錯誤,例如違反前置條件。

第 41 條:避免不必要的使用檢查型異常。換句話說,對于調(diào)用者不可能從其中恢復(fù)的情形,或者惟一可以預(yù)見的響應(yīng)將是程序退出,則不要使用檢查型異常。

第 43 條:拋出與抽象相適應(yīng)的異常。換句話說,一個方法所拋出的異常應(yīng)該在一個抽象層次上定義,該抽象層次與該方法做什么相一致,而不一定與方法的底層實現(xiàn)細節(jié)相一致。例如,一個從文件、數(shù)據(jù)庫或者 JNDI 裝載資源的方法在不能找到資源時,應(yīng)該拋出某種ResourceNotFound 異常(通常使用異常鏈來保存隱含的原因),而不是更底層的IOException 、SQLException 或者NamingException 。

一、Java中異常概述

1.1Java異常結(jié)構(gòu)

        Throwable可以用來表示任何可以被作為異常拋出的類。Throwable對象派生出兩種類型:Error和Exception,前者用來表示編譯時和系統(tǒng)錯誤,程序員往往不必關(guān)心;后者是可以被拋出的基本類型,需要程序員關(guān)注。RuntimeException是Exception的派生類,不同點將在2.2與2.3小結(jié)中描述。

       Java的異常(Exception)按照編譯器檢查方式又可以分為檢查型異常(CheckedException)和非檢查型異常(UncheckedException)。

1.2檢查型異常(CheckedException)

        在Java中所有不是RuntimeException派生的Exception都是檢查型異常。當函數(shù)中存在拋出檢查型異常的操作時該函數(shù)的函數(shù)聲明中必須包含throws語句。調(diào)用改函數(shù)的函數(shù)也必須對該異常進行處理,如不進行處理則必須在調(diào)用函數(shù)上聲明throws語句。

        檢查型異常是JAVA首創(chuàng)的,在編譯期對異常的處理有強制性的要求。在JDK代碼中大量的異常屬于檢查型異常,包括IOException,SQLException等等。

1.3非檢查型異常(UncheckedException) 

       在Java中所有RuntimeException的派生類都是非檢查型異常,與檢查型異常相對拋出非檢查型異??梢圆辉诤瘮?shù)聲明中添加throws語句,調(diào)用函數(shù)上也不需要強制處理。

        常見的NullPointException,ClassCastException是常見的非檢查型異常。非檢查型異常 可以不使用try...catch進行處理,但是如果有異常產(chǎn)生,則異常將由JVM進行處理。對于RuntimeException的子類最好也使用異常處理機制。雖然RuntimeException的異??梢圆皇褂胻ry...catch進行處理,但是如果一旦發(fā)生異常,則肯定會導(dǎo)致程序中斷執(zhí)行,所以,為了保證程序再出錯后依然可以執(zhí)行,在開發(fā)代碼時最好使用try...catch的異常處理機制進行處理。

1.4異常的關(guān)鍵字

        Java異常處理涉及到五個關(guān)鍵字,分別是:try、catch、finally、throw、throws

        五個關(guān)鍵字的相關(guān)語法略。

二、異常處理方式

2.1異常鏈

        在JDK1.4以后版本中,Throwable類支持異常鏈機制。Throwable 包含了其線程創(chuàng)建時線程執(zhí)行堆棧的快照。它還包含了給出有關(guān)錯誤更多信息的消息字符串。最后,它還可以包含 cause(原因):另一個導(dǎo)致此 throwable 拋出的 throwable。它也稱為異常鏈 設(shè)施,因為 cause 自身也會有 cause,依此類推,就形成了異常鏈,每個異常都是由另一個異常引起的。

        通俗的說,異常鏈就是把原始的異常包裝為新的異常類,并在新的異常類中封裝了原始異常類,這樣做的目的在于找到異常的根本原因。

2.2異常的轉(zhuǎn)譯

        異常轉(zhuǎn)譯就是將一種異常轉(zhuǎn)換另一種新的異常并且再拋出的過程,異常轉(zhuǎn)譯的目的是將系統(tǒng)中出現(xiàn)的不同類型的異常進行型別的統(tǒng)一,以便于異常的統(tǒng)一處理。
絕大多數(shù)情況下轉(zhuǎn)譯出的“結(jié)果異?!鳖愋投际亲远x異常,并且在異常轉(zhuǎn)譯過程中需要將“原始異?!狈胖迷诋惓f溨?。

2.3自定義異常

        自定義異常就是自寫的繼承了Exception或RuntimeException的異常類。實現(xiàn)自定義異常的目的大致可分為以下三種:

        1.使用統(tǒng)一的類型標識多種不同型別的異常。

        2.在產(chǎn)生異常時更好的進行信息傳遞。常見的手段是在異常中定義異常碼,異常信息,環(huán)境對象等字段。

        3.將檢查型異常轉(zhuǎn)換為非檢查型異常。

三異常處理

3.1關(guān)于檢查型異常與非檢查型異常的爭論

        在實際編程過程中使用檢查型異常與非檢查型異常的時機從JAVA語言產(chǎn)生的那一天開始就已經(jīng)產(chǎn)生。

        最為官方的說法可以參考Java最核心設(shè)計者之一JOSHUA BLOCH的《Effective Java》異常使用章節(jié),他的主張是:對可恢復(fù)的情況使用檢查型異常,對編程錯誤使用運行時異常。

        雖然上述說法有著“皇家血統(tǒng)”但事實上在我看來Java的檢查型異常是一個非常失敗的作品,因為檢查型異常具有超強的“污染性”,它的出現(xiàn)所帶來的麻煩遠比好處要多得多。我的觀點是:幾乎在所有的情況下都不應(yīng)當使用檢查型異常。當遇到檢查型異常無法處理的情況時,應(yīng)該使用異常轉(zhuǎn)譯轉(zhuǎn)換為非檢查型異常再拋出。我非常興奮的看到在Think in Java 4th Edition上作者對這樣的觀點進行了詳細的描述。

        Java創(chuàng)造檢查型異常的初衷是在編譯期強制程序員對異常情況進行處理,從而使得程序更加的強壯可靠,可是Java的作者忘記了:好的程序設(shè)計語言能幫助程序員寫出好程序,但無論那種語言都避免不了程序員用它寫出壞程序。

        對于異常處理的關(guān)鍵點并不在于是在編譯期還是運行期對異常進行檢查,而在于異常一定要檢查并且需要建立統(tǒng)一的、一致的異常檢查與處理模型。

3.2我的異常處理原則

        1.僅處理當前可處理的異常。

        2.對所有的檢查型異常使用異常轉(zhuǎn)譯。

        3.所有的自定義異常都是非檢查型異常。

        4.異常流程與正常流程進行分離,并盡可能的統(tǒng)一處理。

        5.在非異常處理模塊的catch塊中盡可能不記日志。

        6.除非是進行資源釋放操作,否則catch塊不應(yīng)為空或者出現(xiàn)e.printTrace

        7.finally塊中不能出現(xiàn)復(fù)雜的操作,且不可以拋出異常,也不可以出現(xiàn)return。

3.3我處理異常的一般方式

        1.將throw語句視為異常流程的起點,將Exception對象視作正常流程向異常流程躍遷過程中的數(shù)據(jù)載體。

        2.建立統(tǒng)一的自定義異常類型,用以包裝所有檢查型異常。

        3.大多數(shù)情況下僅在程序的主干上建立唯一的異常捕獲點,并在這個點上對接收到的異常進行處理。

總結(jié)

以上是本文的全部內(nèi)容,希望對大家有所幫助。

相關(guān)文章

  • Java模擬rank/over函數(shù)實現(xiàn)獲取分組排名的方法詳解

    Java模擬rank/over函數(shù)實現(xiàn)獲取分組排名的方法詳解

    這篇文章主要為大家詳細介紹了Java模擬rank()、over()函數(shù)獲取分組排名的方法設(shè)計及實現(xiàn),文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-04-04
  • 開放封閉原則_動力節(jié)點Java學(xué)院整理

    開放封閉原則_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了開放封閉原則,開放-封閉原則是面向?qū)ο笤O(shè)計的核心所在,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 學(xué)習(xí)java多線程

    學(xué)習(xí)java多線程

    本文運用了大量的代碼講解了java多線程,它可以提高程序并行執(zhí)行的速度,更快的響應(yīng)程序。感興趣的小伙伴一起來看看吧
    2021-08-08
  • Spring實現(xiàn)對象注入的三種方法詳解

    Spring實現(xiàn)對象注入的三種方法詳解

    這篇文章主要為大家學(xué)習(xí)介紹了Spring中實現(xiàn)對象注入的三種常用方法,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-07-07
  • Java回調(diào)函數(shù)實例代碼詳解

    Java回調(diào)函數(shù)實例代碼詳解

    這篇文章主要介紹了Java回調(diào)函數(shù)實例代碼詳解,需要的朋友可以參考下
    2017-10-10
  • SpringBoot如何實現(xiàn)定時任務(wù)示例詳解

    SpringBoot如何實現(xiàn)定時任務(wù)示例詳解

    使用定時任務(wù)完成一些業(yè)務(wù)邏輯,比如天氣接口的數(shù)據(jù)獲取,定時發(fā)送短信,郵件。以及商城中每天用戶的限額,定時自動收貨等等,這篇文章主要給大家介紹了關(guān)于SpringBoot如何實現(xiàn)定時任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 關(guān)于springboot配置druid數(shù)據(jù)源不生效問題(踩坑記)

    關(guān)于springboot配置druid數(shù)據(jù)源不生效問題(踩坑記)

    今天日常跟著網(wǎng)課學(xué)習(xí),學(xué)到了整合druid數(shù)據(jù)源,遇到了好幾個坑,希望這篇文章可以幫助一些和我一樣踩坑的人
    2021-09-09
  • 淺談java是如何做資源回收補救的

    淺談java是如何做資源回收補救的

    這篇文章主要介紹了淺談java是如何做資源回收補救的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • druid ParserException類錯誤問題及解決

    druid ParserException類錯誤問題及解決

    這篇文章主要介紹了druid ParserException類錯誤問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring Gateway的入門概述及主要功能

    Spring Gateway的入門概述及主要功能

    Spring Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件,網(wǎng)絡(luò)層使用了基于非阻塞的 Netty使用異步IO增加了系統(tǒng)的性能,Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的,這篇文章主要介紹了Spring Gateway的入門概述簡介,需要的朋友可以參考下
    2024-04-04

最新評論

福清市| 子长县| 中阳县| 偏关县| 芮城县| 绥棱县| 抚远县| SHOW| 喀喇| 临西县| 黔江区| 崇左市| 西昌市| 兴隆县| 肇庆市| 正定县| 镇远县| 伊金霍洛旗| 龙泉市| 攀枝花市| 成安县| 师宗县| 铜川市| 宁海县| 梧州市| 青河县| 邳州市| 南平市| 四会市| 盱眙县| 庆元县| 辛集市| 宣城市| 慈溪市| 化隆| 阿拉善左旗| 西峡县| 阳城县| 昭平县| 八宿县| 合江县|