java 处理异常的场景_Java高级----异常处理机制、自定义异常----含思维导图
Java高級----異常處理機制、自定義異常----含思維導圖
Java高級----異常處理機制、自定義異常----含思維導圖
南一Java自學交流QQ群: 586012641 拒絕任何廣告,共享Java學習資源,歡迎自學Java的朋友加入
一、Java程序中錯誤的分類
1、編譯錯誤:
?? 編譯器能夠檢測到的錯誤,一般是語法錯誤。此時不能將源代碼(.java)編譯成可執行的字節碼文件(.class)。
2、運行錯誤:
?? 程序運行時產生的錯誤,例如被0除、數組下標越界等等。
3、邏輯錯誤:
?? 這是機器本身無法檢測的,需要程序員對運行結果及程序邏輯進行分析才能發現,邏輯錯誤可能會導致運行結果錯誤,有時也可能會導致運行錯誤。
二、Throwable類
1、Error類(錯誤):
?? Error類則包括了一些較少發生的內部系統錯誤。這些錯誤都是嚴重的錯誤,用戶程序無法進行處理,只能通知使用者關閉程序。例如內存不足、虛擬機內部錯誤等等。
2、Exception類(異常):
?? Exception類是所有異常類的父類,包括了一些由程序本身及環境所產生的錯誤。應用Java的異常處理機制,異常(Exception)可以被捕獲并進行相應的處理。例如數組下標越界、被0除等等。
三、異常處理機制的概念
??1、Java 對異常進行了分類,不同類型的異常分別用不同的 Java 類表示,所有異常的根類為 java.lang.Throwable
??2、Throwable下面又派生了兩個子類:Error和Exception,Error表示應用程序本身無法克服和恢復的一種嚴重問題。Exception 表示程序還能夠克服和恢復的問題,其中又分為非檢查(運行)異常和檢查異常,非檢查異常可以避免、不強制必須處理,在運行的時候才會出現異常,只有RuntimeException類或者其子類以及子類的子類是運行異常,其他異常類都是檢查異常。例如,數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常
(NullPointerException)、類轉換異常(ClassCastException);檢查異常是運行環境的變化或異常所導致的問題,
不可避免 在編譯期必須進行異常處理,否則無法通過編譯。
??3、java中異常必須try…catch處理或用throws聲明繼續拋給上層調用方法處理。
四、異常的分類
??1、檢查異常:
????(1)不可避免 在編譯期必須進行異常處理,否則無法通過編譯。
????(2)常見檢查異常:
名字
含義
ClassNotFoundException
無法找到指定的類時發生該異常。
FileNotFoundException
訪問一個不存在的文件時發生該異常。
IOException
通常的I/O錯誤。
??2、非檢查(運行)異常:
????(1)可以避免 不強制必須處理,在運行的時候才會出現異常,只有RuntimeException類或者其子類以及子類的子類是運行異常,其他異常類都是檢查異常。
????(2)常見非檢查(運行)異常:
名字
含義
ArithmeticException
算術異常、如果除數為0,則發生該異常。例:int i = 12 / 0
ArrayIndexOutOfBoundsException
數組下標越界異常、數組下標越界異常。例:int[] a = { 1 }; a[1] = 2;
NullPointerException
空指針異常 對象未實例化時訪問該對象,即對象為空時,任然通過對象.方法調用。則發生該異常。例:int[] a = null; a.toString();
ClassCastException
類型轉換異常
Numberformatexception
表示數字格式化異常
??注意:一個方法一次只能出現一個異常。因為遇到一個異常后,程序就不會繼續向下執行了。
五、異常的處理
1、throw 關鍵字:
?? throw new ArithmeticException();
手動拋出異常。
2、java異常的傳遞:
??異常沿著方法的調用鏈反方向傳遞。
3、java異常的處理方式:
??1、throws聲明處理異常:
????(1)需要一級一級的拋異常,只會顯示出異常信息,不會對異常信息進行處理,異常后面的代碼不會運行。
????(2)可以一次申明多個異常,每個異常中間用,隔開即可。如下 :
public void test3()throws NullPointerException,ArithmeticException,
ArrayIndexOutOfBoundsException, ClassCastException , NumberFormat Exception {
System.out.println("----------test3 before----- ");
Scanner sc = new Scanner(System.in) ;
}
????(3)如果多個異常有公共的父類,可以用父類異常進行替換,例如上面的可以替換成下面代碼:
public void test3()throws Exception {
System.out.println("----------test3 before----- ");
Scanner sc = new Scanner(System.in) ;
}
????(4)用switch循環聲明多個異常的時候,必須把switch里面聲明的異常全寫上,或者用它們共同的父類替換:
public void test3()throws NullPointerException , Arithmeti cException,
ArrayIndexOutOfBoundsException, ClassCastException, NumberFormatException {
System. out. println("----------test3 before----- ") ;
Scanner sC = new Scanner(System.in) ;
inti=sc.nextInt();
switch (i) {
case 0 :
throw new ArithmeticException( );
case 1 :
throw new NullPointerException();
case 2 :
throw new Array IndexOutOfBoundsException( );
case 3:
throw new ClassCastException( );
case 4:
throw new NumberFormatException();
}
System. out. println("----------test3 end----- " ) ;
}
??2、try…catch捕獲式處理異常:
????(1)會顯示出異常信息,同時對異常信息進行處理,異常后面的代碼會繼續運行。
????(2)try…catch可以處理多個異常,一個try{}可以對應多個catch(),也可以在一個catch()里面寫多個異常,用或:|隔開,這種方式稱為muti-catch;如果出現多個異常,可以將ctrch后面的類換成這些類的父類。如下 :
try{
//########################
} catch (ArithmeticException e1) {
e1. printStackTrace( );
}catch ( NullPointerException e2) {
e2. printStackTrace( );
}catch (Array IndexOutOfBoundsException e3) {
e3. pr intStackTrace();
}catch (ClassCastException e4) {
e4. printStackTrace( ) ;
}catch (NumberF ormatException e) {
e. printStackTrace( ) ;
System. out . println("----------test3 end----- ");
try{
//#################
} catch (ArithmeticException | NullPointerException | Array IndexOutOfBoundsException
e1. printStackTrace( ) ;
}
System. out . println("-----test3end-- ");
????(3)catch的執行前提:catch()塊里面的異常只有在和try語句里面捕獲到異常相匹配的時候才會執行,如果try語句塊中沒有匹配到對應的異常,則catch塊里面的語句不會執行。
??3、try…catch…finally:
????(1)finally沒有執行的兩種情況:
?????① 在執行try之前已經return
?????② 在try語句塊中執行System.exit(0);方法
????(2)fially的執行時機:如果try里面有返回值,則finally語句是在try的return語句執行之后,finally語句塊外邊最終的return結果返回到調用此方法之前執行。
??4、Final,finally, finalize三者的區別:
????(1)final:用于聲明屬性,方法和類,分別表示屬性不可變,方法不可重寫(覆蓋),被其修飾的類不可繼承。
????(2)finally:異常處理語句結構的一部分,表示總是執行。
????(3)finalize:Object類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。該方法更像是一個對象生命周期的臨終方法,當該方法被系統調用則代表該對象即將“死亡”,但是需要注意的是,我們主動行為上去調用該方法并不會導致該對
象“死亡”,這是一個被動的方法(其實就是回調方法),不需要我們調用。
六、方法中覆蓋的異常
??1、子類重寫父類方法時,重寫的方法不能比被重寫方法拋出更多更大的異常.
??2、重寫的方法拋出的異常只能是被重寫方法拋出異常的子類(可以同時寫多個異常子類)或相同。
七、Message屬性與異常追蹤
try {
throw new NullPointerException("這是空指針異常");
} catch (Exception e) {
e.printStackTrace();
}
******************************************
java.lang.NullPointerException: 這是空指針異常
at test2.Sample.main(Sample.java:27)
catch(NullPointerException e) {
x=20;
System. out. println("catch. .."+x);
e.printStackTrace();
System.err.println(e. getMessage());
}finally {
}
運行后輸出:test方法中出現空指針異常
八、自定義異常
??1、場景:比如說輸入密碼,三次不正確的時候,拋出錯誤給予提示。
??2、創建檢查異常:
????(1)繼承Exception或除RuntimeException的其他子類。
????(2)編寫構造方法,無參和有參,通過super()將異常信息傳遞給父類。
??3、創建運行(非檢查)異常:
????(1)創建運行異常需要繼承runtimeException類。
????(2)編寫構造方法,通過super()將異常信息傳遞給父類。
public class MyCheckException extends Exception {
public MyCheckException() {
}
public MyCheckException(String msg) {
super(msg);
}
}
public static void test() throws MyCheckException {
throw new MyCheckException("這是自定義的檢查異常");
}
class Test {
public static void main(String[] args) throws MyCheckException {
test();
}
}
九、思維導圖
Java高級----異常處理機制、自定義異常----含思維導圖相關教程
總結
以上是生活随笔為你收集整理的java 处理异常的场景_Java高级----异常处理机制、自定义异常----含思维导图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 标准错误输出_过程的实时标
- 下一篇: java emailbuilder 样式