6.2-全棧Java筆記:異常處理機(jī)制的分類

異常分類

JDK?中定義了很多異常類,這些類對(duì)應(yīng)了各種各樣可能出現(xiàn)的異常事件,所有異常對(duì)象都是派生于Throwable類的一個(gè)實(shí)例。如果內(nèi)置的異常類不能夠滿足需要,還可以創(chuàng)建自己的異常類。

?圖1?異常的分類

?Error

Error類層次描述了Java運(yùn)行時(shí)系統(tǒng)內(nèi)部錯(cuò)誤和資源耗盡錯(cuò)誤。這類錯(cuò)誤是我們無法控制的,同時(shí)也是非常罕見的錯(cuò)誤。所以在編程中,不去處理這類錯(cuò)誤。

Error表明系統(tǒng)JVM已經(jīng)處于不可恢復(fù)的崩潰狀態(tài)中。我們不需要管他。

?圖2 java.lang包中Error的類

Error與Exception的區(qū)別

1.?我開著車走在路上,一頭豬沖在路中間,我剎車。這叫一個(gè)異常。

2.我開著車在路上,發(fā)動(dòng)機(jī)壞了,我停車,這叫錯(cuò)誤。系統(tǒng)處于不可恢復(fù)的崩潰狀態(tài)。發(fā)動(dòng)機(jī)什么時(shí)候壞?我們普通司機(jī)能管嗎?不能。發(fā)動(dòng)機(jī)什么時(shí)候壞是汽車廠發(fā)動(dòng)機(jī)制造商的事。

Exception

Exception類所有異常類的父類,其子類對(duì)應(yīng)了各種各樣可能出現(xiàn)的異常事件。?Exception分為:

1.RuntimeException ??運(yùn)行時(shí)異常

2.CheckedException???編譯時(shí)異常

?RuntimeException運(yùn)行時(shí)異常

派生于RuntimeException的異常,如被?0?除、數(shù)組下標(biāo)超范圍等,其產(chǎn)生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會(huì)對(duì)程序可讀性和運(yùn)行效率影響很大。?因此由系統(tǒng)自動(dòng)檢測(cè)并將它們交給缺省的異常處理程序(用戶可不必對(duì)其處理)。

這類異常通常是由編程錯(cuò)誤導(dǎo)致的,所以在編寫程序時(shí),并不要求必須使用異常處理機(jī)制來處理這類異常,經(jīng)常需要通過增加“邏輯處理來避免這些異?!薄?/p>

【示例1ArithmeticException異常,試圖除以0

public?class?Test {

????public?static?void?main(String[] args) {

???????int?b=0;

???????System.out.println(1/b);

??? }

}

? 示例1? ?ArithmeticException異常

解決如上異常需要修改代碼:

public?class?? Test {

????public?static?void?? main(String[] args) {

???????int?? b=0;

???????if(b!=0){

?????????? System.out.println(1/b);

?????? }

??? }

}

【示例2NullPointerException異常,當(dāng)程序訪問一個(gè)空對(duì)象的成員變量或方法,訪問一個(gè)空數(shù)組的成員時(shí)發(fā)生。怎么處理?

public?class?Test {

????public?static?void?main(String[] args) {

?????? String str=null;

?????? System.out.println(str.charAt(0));

??? }

}

? ?示例2 ?NullPointerException異常

解決空指針異常,通常是增加非空判斷:

public?class?? Test {

????public?static?void?? main(String[] args) {

?????? String str=null;

???????if(str!=null){

?????????? System.out.println(str.charAt(0));

?????? }

??? }

}

【示例3ClassCastException異常

public?class?Test {

????public?static?void?main(String[] args) {

?????? Animal a=new?Dog();

?????? Cat c=(Cat)a;

??? }

}

class?Animal{

}

class?Dog?extends?Animal{

}

class?Cat?extends?Animal{

}



示例3?ClassCastException異常

解決ClassCastException的典型方式:

public?class?? Test {

????public?static?void?? main(String[] args) {

?????? Animal a=new?? Dog();

???????if(a?instanceof?? Cat){

?????????? Cat?c=(Cat)a;

?????? }

??? }

}

class?? Animal{

}

class?? Dog?extends?Animal{

}

class?? Cat?extends?Animal{

}

【示例4ArrayIndexOutOfBoundsException異常,訪問的元素下表超過數(shù)組長(zhǎng)度

public?class?Test {

????public?static?void?main(String[] args) {

???????int?[] arr=new?int[5];

?????? System.out.println(arr[5]);

??? }

}

示例4?ArrayIndexOutOfBoundsException異常

解決數(shù)組索引越界異常的方式,增加關(guān)于邊界的判斷:

public?class?? Test {

????public?static?void?? main(String[] args) {

???????int?[] ? arr=new?int[5];

???????int?a ? = 5;

???????if(a<arr.length){

?????????? System.out.println(arr[a]);

?????? }

??? }

}

【示例5NumberFormatException,數(shù)字格式異常!

public?class?Test {

????public?static?void?main(String[] args) {

?????? String str = "1234abcf";

?????? System.out.println(Integer.parseInt(str));

??? }

}

示例5?NumberFormatException異常

數(shù)字格式化異常的解決,可以引入正則表達(dá)式判斷是否為數(shù)字:


import?? java.util.regex.Matcher;

import?? java.util.regex.Pattern;

public?class?? Test {

????public?static?void?? main(String[] args) {

?????? String str =?"1234abcf";

?????? Pattern p = Pattern.compile("^\\d+$");?

?????? Matcher m = p.matcher(str);


? ? ? ?if(m.matches()){???//如果str匹配代表數(shù)字的正則表達(dá)式

?????????? System.out.println(Integer.parseInt(str));

?????? }

??? }

}

?Checked Exception?已檢查異常

所有不是RuntimeException的異常,統(tǒng)稱為Checked Exception,又被稱為“已檢查異?!?。?這類異常在編譯時(shí)就必須做出處理。

圖?3 ?Checked Exception必須處理,否則無法通過編譯




「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師、高級(jí)工程師、架構(gòu)師。精通Java平臺(tái)軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。


筆記包含從淺入深的六大部分:

A-Java入門階段

B-數(shù)據(jù)庫從入門到精通

C-手刃移動(dòng)前端和Web前端

D-J2EE從了解到實(shí)戰(zhàn)

E-Java高級(jí)框架精解

F-Linux和Hadoop?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,759評(píng)論 18 399
  • 文章來源:http://www.54tianzhisheng.cn/2017/06/04/Java-Thread/...
    beneke閱讀 1,522評(píng)論 0 1
  • 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    葉總韓閱讀 5,162評(píng)論 0 41
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,650評(píng)論 1 114
  • 2016歐洲杯A組末輪,法國(guó)將在里爾的皮埃爾-莫魯瓦球場(chǎng)迎戰(zhàn)瑞士。已經(jīng)提前晉級(jí)的法國(guó)或?qū)㈥嚾葺啌Q備戰(zhàn)淘汰賽...
    梔上清帆閱讀 218評(píng)論 0 2