(一)Java的異常層次結構
要想明白Java中checked Exception和unchecked Exception的區別,我們首先來看一下Java的異常層次結構。
這是一個簡化的Java異常層次結構示意圖,需要注意的是所有的類都是從Throwable繼承而來,下一層則分為兩個結構,Error和Exception。其中Error類層次描述了Java運行時系統的內部錯誤和資源耗盡錯誤,這種錯誤除了簡單的報告給用戶,并盡力阻止程序安全終止之外,一般也米有別的解決辦法了。
(二)unchecked異常和checked異常的區別
有了上面的認識之后,我們再來看什么是checked異常,什么是unchecked的異常。其實,Java語言規范對這兩個定義十分簡單,將派生于Error或者RuntimeException的異常稱為unchecked異常,所有其他的異常成為checked異常。盡管,這個定義十分簡單,但是RuntimeException卻是一個非常讓人容易混淆的觀念,似乎我們所有的異常都是在程序運行的過程中。我《Effective Java》中關于Ru ntimeException異常的闡述也不是那么盡如人意,
Use checked exceptions for recoverable conditions and runtime exceptions for programming errors (Item 58 in 2nd edition)
不過從這句話中我們可以簡單引申一下,也就是說,如果出現了RuntimeException,就一定是程序員自身的問題。比如說,數組下標越界和訪問空指針異常等等,只要你稍加留心這些異常都是在編碼階段可以避免的異常。如果你還是覺得這兩個概念不好區分,那么“最暴力“的方法就是將常見的RuntimeException背下來,這樣就可以省去很多判斷的時間。
(三)為什么要對unchecked異常和checked異常進行區分?
原因其實很簡單,編譯器將檢查你是否為所有的已檢查異常提供了異常處理機制,比如說我們使用Class.forName()來查找給定的字符串的class對象的時候,如果沒有為這個方法提供異常處理,編譯是無法通過的。
(四)我們應該對哪些異常進行聲明?
我們前面說,RuntimeException是在programing過程中可以避免的錯誤,那是不是我們就不需要拋出這些異常呢?原則上來說,是這樣的,但是Java規范中并沒有對此進行限制,只是看上去你拋出一個數組越界的異常并沒有多少實際意義,相反還會對性能造成一定的損失。那么我們應該如何來設計拋出異常呢?我們要記住以下兩種情況是必聲明throws異常的:
調用一個checked異常的方法,例如IOException,至于原因我們前面已經討論過了,如果拋出所有的checked異常時無法通過編譯的。程序運行過程中發現錯誤,利用throw語句拋出一個異常。對于unchecked異常,無非主要是兩種情況要么是可以避免的(Runtime Exception),要么是不可控制的。這些也是需要聲明異常的。
下面列舉例子說明上面的注意事項2中提到的比較別扭的地方:
首先定義一個基本的異常類GenericException,繼承于Exception。
packagecheck_unchecked_exceptions;publicclassGenericExceptionextendsException{/****/privatestaticfinallongserialversionuid=2778045265121433720L;publicGenericException(){}publicGenericException(Stringmsg){super(msg);}}
下面定義一個測試類VerifyException。
packagecheck_unchecked_exceptions;publicclassVerifyException{publicvoidfirst()throwsGenericException{thrownewGenericException("checkedexception");}publicvoidsecond(Stringmsg){if(msg==null){thrownewNullPointerException("uncheckedexception");}}publicvoidthird()throwsGenericException{first();}publicstaticvoidmain(String[]args){VerifyExceptionve=newVerifyException();try{ve.first();}catch(GenericExceptione){e.printStackTrace();}ve.second(null);}}
運行后,在eclipse的控制臺上得到下面的信息:
check_unchecked_exceptions.GenericException: checked exception
at check_unchecked_exceptions.VerifyException.first(VerifyException.java:6)
at check_unchecked_exceptions.VerifyException.main(VerifyException.java:23)
Exception in thread "main" java.lang.NullPointerException: unchecked exception
at check_unchecked_exceptions.VerifyException.second(VerifyException.java:11)
at check_unchecked_exceptions.VerifyException.main(VerifyException.java:29)
上面的例子,結合checked以及unchecked的概念,可以看出Exception這個父類是checked類型,但是其子類RuntimeException (子類NullPointerException)卻是unchecked的。
看完上述內容,你們對Java中checked與unchecked異常的區別是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注本站行業資訊頻道,感謝大家的支持。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
說了這么多次的房地產稅終于要來了,據最新消息稱,部分地區將開展房地產稅改革試點,那么具體會有哪些相關的措施推出呢?房地產稅一旦實施將會帶來哪些影響?下面我們來了解一下。房地產稅是政府對房地產征收的一種財產稅。它通常向業主或租戶等用戶征收。負責征收房地產稅的政府機構將對房地產價值進行估價,并以房地產價值的一定比例作為應繳稅款。為積極穩妥推進房地產稅立法改革,引導合理住房消費和節約集約利用土地資源,促...
近日,央行、銀保監會、外匯局等三部門分別開會,釋放股債匯房重磅信息。其中,央行、外匯局在會上提出,加強部門協作,維護股市、債市、樓市健康發展。下面,我們一起來具體了解一下吧。在促進經濟高質量發展方面,央行、外匯局會上要求,加強部門協作,維護股市、債市、樓市健康發展。在堅持全心全意為人民服務方面,央行、外匯局表示,強化對重點領域、薄弱環節和受疫情影響行業、群體的支持,抓好已出臺政策落地見效,研究出臺...
中信銀行電子賬戶具體含義。中信銀行電子賬戶是指用戶通過電子渠道實名開立的,可以購買投資理財產品等指定金融產品的賬戶,屬于非面對面開立的二類銀行賬戶或三類銀行賬戶。要在中信銀行,開立電子賬戶,您必須年滿16歲,在身份證的正面和背面提供真實、完整和準確的信息,并核實手機號碼必須與綁定到該賬戶的手機號碼一致。中信銀行電子賬戶可以為用戶提供金融產品和服務,但不會向用戶發送紙質票據,用戶只能通過指定的電子渠...