異常分類
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>
【示例1】ArithmeticException異常,試圖除以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);
?????? }
??? }
}
【示例2】NullPointerException異常,當(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));
?????? }
??? }
}
【示例3】ClassCastException異常
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{
}
【示例4】ArrayIndexOutOfBoundsException異常,訪問的元素下表超過數(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]);
?????? }
??? }
}
【示例5】NumberFormatException,數(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?