異常分類
JDK?中定義了很多異常類卒废,這些類對應了各種各樣可能出現(xiàn)的異常事件寓盗,所有異常對象都是派生于Throwable類的一個實例。如果內(nèi)置的異常類不能夠滿足需要故慈,還可以創(chuàng)建自己的異常類辩昆。
?圖1?異常的分類
?Error
Error類層次描述了Java運行時系統(tǒng)內(nèi)部錯誤和資源耗盡錯誤阅酪。這類錯誤是我們無法控制的旨袒,同時也是非常罕見的錯誤汁针。所以在編程中,不去處理這類錯誤砚尽。
Error表明系統(tǒng)JVM已經(jīng)處于不可恢復的崩潰狀態(tài)中施无。我們不需要管他。
?圖2 java.lang包中Error的類
Error與Exception的區(qū)別
1.?我開著車走在路上必孤,一頭豬沖在路中間猾骡,我剎車。這叫一個異常敷搪。
2.我開著車在路上兴想,發(fā)動機壞了,我停車赡勘,這叫錯誤嫂便。系統(tǒng)處于不可恢復的崩潰狀態(tài)。發(fā)動機什么時候壞闸与?我們普通司機能管嗎毙替?不能。發(fā)動機什么時候壞是汽車廠發(fā)動機制造商的事践樱。
Exception
Exception類所有異常類的父類厂画,其子類對應了各種各樣可能出現(xiàn)的異常事件。?Exception分為:
1.RuntimeException ??運行時異常
2.CheckedException???編譯時異常
?RuntimeException運行時異常
派生于RuntimeException的異常拷邢,如被?0?除袱院、數(shù)組下標超范圍等,其產(chǎn)生比較頻繁,處理麻煩忽洛,如果顯式的聲明或捕獲將會對程序可讀性和運行效率影響很大抛人。?因此由系統(tǒng)自動檢測并將它們交給缺省的異常處理程序(用戶可不必對其處理)。
這類異常通常是由編程錯誤導致的脐瑰,所以在編寫程序時妖枚,并不要求必須使用異常處理機制來處理這類異常,經(jīng)常需要通過增加“邏輯處理來避免這些異常”苍在。
【示例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異常,當程序訪問一個空對象的成員變量或方法寂恬,訪問一個空數(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ù)組長度
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ù)字格式化異常的解決,可以引入正則表達式判斷是否為數(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ù)字的正則表達式
?????????? System.out.println(Integer.parseInt(str));
?????? }
??? }
}
?Checked Exception?已檢查異常
所有不是RuntimeException的異常妄壶,統(tǒng)稱為Checked Exception摔握,又被稱為“已檢查異常”丁寄。?這類異常在編譯時就必須做出處理氨淌。
圖?3 ?Checked Exception必須處理,否則無法通過編譯
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記伊磺。筆者江湖人稱 Mr. G盛正,10年Java研發(fā)經(jīng)驗,曾在神州數(shù)碼屑埋、航天院某所研發(fā)中心從事軟件設計及研發(fā)工作豪筝,從小白逐漸做到工程師、高級工程師雀彼、架構(gòu)師壤蚜。精通Java平臺軟件開發(fā),精通JAVAEE徊哑,熟悉各種流行開發(fā)框架袜刷。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰(zhàn)
E-Java高級框架精解
F-Linux和Hadoop?