java——異常

異常:是在運行時期發(fā)生的不正常情況

在java中用類的形式對不正常情況進行了描述和封裝對象。
描述不正常的情況的類,就稱為異常類。

現(xiàn)在將正常流程代碼和問題處理代碼分離。提高閱讀性.
其實異常就是java通過面向?qū)ο蟮乃枷雽栴}封裝成了對象.

用異常類對其進行描述。
不同的問題用不同的類進行具體的描述。 比如角標越界??罩羔樀鹊?。
問題很多,意味著描述的類也很多,
將其共性進行向上抽取,形成了異常體系。

最終問題(不正常情況)就分成了兩大類。

Throwable:無論是error,還是Exception:,問題發(fā)生就應(yīng)該可以拋出,讓調(diào)用者知道并處理。
該體系的特點就在于Throwable及其所有的子類都具有可拋性。

可拋性到底指的是什么呢?怎么體現(xiàn)可拋性呢?

其實是通過兩個關(guān)鍵字來體現(xiàn)的。
throws throw ,凡是可以被這兩個關(guān)鍵字所操作的類和對象都具備可拋性.

Throwable
|--Error 是系統(tǒng)不可恢復的錯誤,JVM發(fā)生的錯誤

| |--OutOfMemoryError 堆內(nèi)存溢出
| |--StackOverflowError 棧內(nèi)存溢出

|--Exception 程序可以檢查處理的異常,常見的異常繼承根

|--java.text.ParseException format 解析對象時候發(fā)生
| 如:Date d = dateformat.parse("2010-5-5");
|--RuntimeException 非檢查異常,Javac忽略對這類異常的語法檢查
|--IllegalArgumentException
|--NullPointerException
|--ArrayIndexOutOfBoundsException
|--ClassCastException
|--NumberFormatException * Integer.parseInt(S)

關(guān)于異常的分類:

1、Throwable 類是 Java 語言中所有錯誤或異常的超類(這就是一切皆可拋的東西)。它有兩個子類:Error和Exception。
2、Error:用于指示合理的應(yīng)用程序不應(yīng)該試圖捕獲的嚴重問題。這種情況是很大的問題,大到你不能處理了,所以聽之任之就行了,你不用管它。
3、Exception:它指出了合理的應(yīng)用程序想要捕獲的條件。Exception又分為兩類:
一種是CheckedException,一種是UncheckedException。這兩種Exception的區(qū)別主要是CheckedException需要用try...catch...顯示的捕獲,而UncheckedException不需要捕獲。通常UncheckedException又叫做RuntimeException。

對于可恢復的條件使用被檢查的異常(CheckedException),
對于程序錯誤(言外之意不可恢復,大錯已經(jīng)釀成)使用運行時異常(RuntimeException)。

4、我們常見的RuntimeExcepiton有
IllegalArgumentException、IllegalStateException、NullPointerException、IndexOutOfBoundsException等等。
對于那些CheckedException就不勝枚舉了,我們在編寫程序過程中try...catch...捕捉的異常都是CheckedException。io包中的IOException及其子類,這些都是CheckedException。

該體系的特點:
子類的后綴名都是用其父類名作為后綴,閱讀性很強。
注意:
如果讓一個類稱為異常類,必須要繼承異常體系,因為只有稱為異常體系的子類才有資格具備可拋性。才可以被兩個關(guān)鍵字所操作,throws throw

異常的分類:

1,編譯時被檢測異常:只要是Exception和其子類都是,除了特殊子類RuntimeException體系。
這種問題一旦出現(xiàn),希望在編譯時就進行檢測,讓這種問題有對應(yīng)的處理方式。這樣的問題都可以針對性的處理。

2,編譯時不檢測異常(運行時異常):就是Exception中的RuntimeException和其子類。
這種問題的發(fā)生,無法讓功能繼續(xù),運算無法進行,更多是因為調(diào)用者的原因?qū)е碌亩蛘咭l(fā)了內(nèi)部狀態(tài)的改變導致的。

那么這種問題一般不處理,直接編譯通過,在運行時,讓調(diào)用者調(diào)用時的程序強制停止,讓調(diào)用者對代碼進行修正。

所以自定義異常時,要么繼承Exception。要么繼承RuntimeException。

throws 和throw的區(qū)別。

1,throws使用在函數(shù)上。
throw使用在函數(shù)內(nèi)。
2,throws拋出的是異常類,可以拋出多個,用逗號隔開。
throw拋出的是異常對象。

異常:阻止當前方法或作用域繼續(xù)執(zhí)行的問題
調(diào)用拋出異常的方法,必須處理異常,有兩種方式:
1、使用try catch finally 捕獲。
2、直接再拋出異常。
捕獲異常

1) try 是嘗試運程代碼塊,如果有異常會被隨后的catch捕獲,異常發(fā)生以后代碼不執(zhí)行。
2) catch代碼塊是異常處理代碼,需要提供合理的處理。
1、異常的處理是不具體業(yè)務(wù)邏輯有關(guān)。
2、可以寫多個catch處理一系列異常,但是要注意:異常的大小關(guān)系,大類型的放到后面處理。
3) 有的時候直接catch(Exception) 粗粒度處理異常,代碼簡潔,語義含糊. 根據(jù)業(yè)務(wù)邏輯適 當選用。
4) finally代碼塊,不管是否出現(xiàn)異常,總會執(zhí)行的代碼塊。
1、finally經(jīng)常用來處理現(xiàn)場的清理,比如:可靠的數(shù)據(jù)庫連接關(guān)閉。
5) 處理異常有一個基本原則:能夠底層處理的盡量處理,但是如果不能處理,必須拋出到調(diào)用者 (方法)。不應(yīng)該簡單的拋棄。
6) 異常捕獲再拋出, 是一種把底層異常迚行封裝,轉(zhuǎn)換為另外一種異常類型。
7) 建議在捕獲到異常時候使用e.printStackTrace(),打印到控制臺。
1、輸出內(nèi)容是:出現(xiàn)異常時候的方法調(diào)用堆棧。
2、一般情況下,凡是捕獲異常代碼都輸出:e.printStackTrace()
3、finally永遠會被執(zhí)行。
4、捕獲(catch)異常有順序,異常“由小到大”,否則會出編譯錯誤。

異常處理的原則:

1,函數(shù)內(nèi)容如果拋出需要檢測的異常,那么函數(shù)上必須要聲明。
否則必須在函數(shù)內(nèi)用trycatch捕捉,否則編譯失敗。

2,如果調(diào)用到了聲明異常的函數(shù),要么trycatch要么throws,否則編譯失敗。

3,什么時候catch,什么時候throws 呢?
功能內(nèi)容可以解決,用catch。
解決不了,用throws告訴調(diào)用者,由調(diào)用者解決 。

4,一個功能如果拋出了多個異常,那么調(diào)用時,必須有對應(yīng)多個catch進行針對性的處理。
內(nèi)部又幾個需要檢測的異常,就拋幾個異常,拋出幾個,就catch幾個。

自定義異常

軟件中會大量使用自定義異常,一般從Exception繼承異常類命名要有實際意義, 一般都手工繼承父類的構(gòu)造器。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容