摘要:相關類的結構如下所示類類是語言中所有錯誤和異常的超類,只有當一個對象直接或者間接的是此類的實例時,才能通過語句拋出異常,同樣,只有這種類才能被語句捕獲進行處理類的子類是錯誤,不是程序可以處理的,一般會是內存不足,線程終止,虛擬機運行錯誤等,
相關類的結構如下所示
java.lang.Object
java.lang.Throwable
java.lang.Error
java.lang.Exception
java.lang.RuntimeException
Throwable類Throwable 類是Java語言中所有錯誤和異常的超類,只有當一個對象直接或者間接的是此類的實例時,Java才能通過throw語句拋出異常,同樣,只有這種類才能被try……catch語句捕獲進行處理
Throwable類的子類Error是錯誤,不是程序可以處理的,一般會是內存不足,線程終止,Java虛擬機運行錯誤等,只能聽之任之,JVM通常會kill掉這個進程
Throwable類的子類Exception是異常,是程序可以處理的,進一步分為CheckedException 和 UncheckedException
CheckedException發生在編譯階段,代碼語句必須使用try……catch或者throws,否則無法進行編譯,比如StreamTokenizer必須聲明拋出異常IOException,除了Runtime Exception類集之外,其他的Exception類集都是CheckeException
UncheckedException發生在程序的運行階段,一般來說具有不確定性,不容易定位和DEBUG
Exception類
該類指出了合理的應用程序想要捕獲的異常條件,有兩個參數,默認構造可以是兩個可選參數,一個是詳細信息,一個是異常原因,分別對應下述四個構造方法,分別于super對應
public Exception()
public Exception(String message)
public Exception(String message, Throwable cause)
public Exception(Throwable cause)
RuntimeException類RuntimeException是那些在Java 虛擬機正常運行期間拋出的異常的超類,屬于uncheckedException,比如說發生數組越界,空指針等邏輯引起的問題
可能在執行方法期間拋出,但是沒有被捕獲的RuntimeException的任何子類都不用在throws子句中聲明
包含四個構造方法
RuntimeException()
RuntimeException(String message)
RuntimeException(String message, Throwable cause)
RuntimeException(Throwable cause)
try - catch - finally在try代碼片段中,包含著有可能拋出異常的語句,如果無異常,則直接跳到finally代碼塊,否則相應的捕獲異常,執行catch代碼塊的內容
無論是否try代碼塊發生異常,finally都會被執行,可以在這里進行一些接口的close操作等
如果代碼中顯式的聲明了某一個異常類型,則異常處理機制不會顯示這個異常是在哪里拋出的,如果是沒有聲明異常遭遇中斷,異常處理會顯示出處
每一個catch按照書寫的先后依次匹配執行,一旦亦常被某一個catch捕獲,則必不會被其他的catch捕獲處理
當try代碼塊或者catch代碼塊中包括return語句的時候,finally代碼塊將會在return之前被強制執行,finally不被執行僅僅當下列條件被滿足:
代碼在finally代碼塊之前即發生錯誤
代碼在finally代碼塊之前進行了System.exit()
當前線程由于某種情況丟失
關機,或者各種奇葩的可能條件
throw 和 throwsthrows 是方法拋出異常的聲明,表示一個預動作,說明下方方法可能會拋出異常,throws不做其他處理,僅僅是上交異常到調用,方法中拋出的任何異常都必須有throws聲明,除非是將交由運行時系統自動拋出的RuntimeException
throw是拋出異常,是一個明確的動作,必須與try……catch或者throws一起使用,拋出的只能是Throwable的類集中的類,如果所有的方法都將異常往上層調用者拋,那么JVM最后的處理就是打印異常消息和堆棧信息
自定義異常類型一般來說,套路如下:
定義一個類,繼承自Throwable或者某一個子類
構造方法,或者直接使用super的構造方法
throws聲明,在代碼塊的某處throw該異常類
catch到拋出的異常進行處理
異常鏈機制當異常較少的時候,我們可以對每一個異常進行try 和catch, 但是如果出現多個異常,顯然通過一個Exception處理所有異常的方式會增加維護代碼DEBUG的困難度,所以我們需要將異常信息進行封裝,然后捕獲我們的異常封裝類即可
異常的處理方式有兩種,一種是throws拋出異常后交給上級去處理,另一種就是使用try和catch進行具體的修正處理,異常鏈的處理采用第一種方式,在try ……catch的catch代碼塊中不做任何處理,唯一的動作就是拋出封裝好的異常信息,然后會有throws拋出該異常,遞歸的每一層都如此控制異常拋出,就形成了一條異常鏈
如果我們想要在捕獲到一個異常后拋出另外一個異常,那么,我們可以調用Throwable類集的getCause()方法,得到類中的cause參數,這個參數保存的就是原始存有的異常信息,也就是說cause是導致拋出該throwable的throwable
保留有異常鏈的catch代碼塊中可以使用Throwable的printStackTrace()方法來打印整個異常信息
getCause() 返回由一個需要Throwable的構造方法提供的cause,或者是在創建Throwable之后通過initCause()來設定cause,子類不必要重寫,也不必重寫printStackTrace()
printStackTrace()方法會將對象的堆棧跟蹤輸出到輸出流,作為System.err的值
幾個建議盡量在try中不要包含太多的代碼,縮小異常范圍圈
如果有的接口即使有異常也照樣要運行,那么應該使用finally
縮小catch捕獲的異常,盡量使catch捕獲明確的單個異常
拋出異常的時候,盡量包含易讀易懂的描述和名稱
不在構造函數中拋出異常,不在finally代碼塊中處理返回
不要老拋出異常,會降低Java的效率和系統的性能
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72367.html
摘要:中很多特性或者說知識點都是和面向對象編程概念相關的。在多線程中內容有很多,只是簡單說明一下中初步使用多線程需要掌握的知識點,以后有機會單獨再詳細介紹一些高級特性的使用場景。 寫這篇文章的目的是想總結一下自己這么多年來使用java的一些心得體會,主要是和一些java基礎知識點相關的,所以也希望能分享給剛剛入門的Java程序員和打算入Java開發這個行當的準新手們,希望可以給大家一些經...
摘要:對象的自動清除對象回收是由垃圾回收線程負責方法可以要求系統進行垃圾回收,僅僅是建議系統沒有析構方法,但的有類似方法系統在回收時會自動調用對象的方法子類的方法可以在里面釋放系統資源,一般來說,子類的方法中應該調用父類的方法。 對象的自動清除 對象回收是由垃圾回收線程負責 System.gc()方法可以要求系統進行垃圾回收,僅僅是建議系統 java沒有析構方法,但Object的final...
摘要:異常處理作用調試程序定位缺陷。對異常的處理是系統容錯可靠性的一環。拋出需要具體子異常捕獲同時也需要具體子異常不同子異常處理會不同。如有基礎基類異常調用者可以選擇使用這個基類該類下面的所有子異常使用統一處理也可以單獨對子異常處理。 showImg(https://segmentfault.com/img/bVbrm5g); 1 背景 1年前的文章,源于Sonar靜態代碼掃描中,項目歷史代...
閱讀 730·2023-04-25 19:43
閱讀 3974·2021-11-30 14:52
閱讀 3801·2021-11-30 14:52
閱讀 3865·2021-11-29 11:00
閱讀 3796·2021-11-29 11:00
閱讀 3894·2021-11-29 11:00
閱讀 3571·2021-11-29 11:00
閱讀 6154·2021-11-29 11:00