真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中檢查型異常與非檢查型異常的區(qū)別是什么

本篇文章給大家分享的是有關(guān)Java中檢查型異常與非檢查型異常的區(qū)別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

站在用戶的角度思考問題,與客戶深入溝通,找到廬江網(wǎng)站設(shè)計與廬江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋廬江地區(qū)。

        對于因為編程錯誤而導致的異常,或者是不能期望程序捕獲的異常(解除引用一個空指針,數(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 的捕獲或者指定要求的意圖,并且對于那些使用您提供的類的程序員可能會導致問題。

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

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

        換句話說,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 條:為可恢復的條件使用檢查型異常,為編程錯誤使用運行時異常。這里,Bloch 回應(yīng)傳統(tǒng)的 Sun 觀點 —— 運行時異常應(yīng)該只是用于指示編程錯誤,例如違反前置條件。

第 41 條:避免不必要的使用檢查型異常。換句話說,對于調(diào)用者不可能從其中恢復的情形,或者惟一可以預見的響應(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ā)生異常,則肯定會導致程序中斷執(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(原因):另一個導致此 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)譯過程中需要將“原始異常”放置在異常鏈中。

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é),他的主張是:對可恢復的情況使用檢查型異常,對編程錯誤使用運行時異常。

        雖然上述說法有著“皇家血統(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)復雜的操作,且不可以拋出異常,也不可以出現(xiàn)return。

3.3我處理異常的一般方式

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

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

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

以上就是Java中檢查型異常與非檢查型異常的區(qū)別是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁題目:Java中檢查型異常與非檢查型異常的區(qū)別是什么
本文網(wǎng)址:http://weahome.cn/article/gccdie.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部