第9章異常
Throwable類
Throwable是所有異常的父類.而Throwable又有倆個直接子類:
1、Error:這個錯誤一般是JVM和硬體引發的問題,發生了這個錯誤,一般是不通過程式碼去處理問題的
2、Exception:稱之為異常,異常是程式在編譯、執行的時候出現的異常,使用者可以對異常進行具體的處理,一般可以通過修改程式碼來處理異常.如果不去處理異常的話,程式將會停止執行.
只有當物件是Throwable類的子類型別的時候,該物件才能通過java虛擬機器和throw語句丟擲.
例子:
Throwable t1=new Throwable(); //建立一個Throwable型別的異常,括號內可以填寫該異常的詳細資訊
Throwable類有些常用來顯示異常資訊的方法:
1、物件.getMessage();會返回該異常物件的詳細資訊字串
2、物件.toString();當列印物件的時候會自動呼叫的方法,會返回該物件的父類和詳細資訊,
3、物件.printStackTrace();列印方法 這個是最常用的,會打印發生錯誤的程式碼行號,且異常資訊會報紅
異常和錯誤
程式異常是指程式在編譯或執行期間發生了某種異常,需要處理異常,否則程式會結束執行(如陣列索引越界等問題)
程式錯誤時程式在執行期間發生了某種錯誤(Error).通常沒有具體的處理方式,程式會結束執行,一般都是系統級別的問題,使用者一幫無法針對Error進行處理,只能修正程式碼.是JVM所在系統發生並反饋給JVM的.(如記憶體超出等問題)
捕獲處理
用法:
// //捕獲處理 // try { // //可能發生異常的程式碼 // } catch(異常型別 變數名){ // //發生異常後的處理 // }
如果不進行異常處理的話,一發生異常程式就停止了,如果想要當發生異常後繼續執行catch之後的程式碼,就需要使用到異常捕獲了.
我們可以將可能會發生異常的程式碼放入try語句中,發生異常後處理異常的語句放在catch語句中,而異常處理完想要執行的語句放在後面.
丟擲處理
除了捕獲處理,還有丟擲處理,當方法內部不想處理異常,就可以進行丟擲處理,讓呼叫者來處理異常問題.
例子:
public static int demomo(int a,int b) throws Exception{//宣告丟擲異常的型別 if (b==0) { throw new Exception("除數為0"); //throw是用於方法內部用於丟擲一個異常的,而throws是用於方法宣告上的,說明丟擲的異常型別 //而throw後面只能有一個異常物件,throws後面一次能夠宣告多個異常型別. } return a/b; } }
這個方法就進行了丟擲異常,內部不進行處理,而進行丟擲,讓呼叫者自己處理異常.
異常分類
異常分為倆種:
1、執行時異常:是RuntimeException的子類,比如NullPointException(空指標異常)與ArrayIndexOutOfBoundException異常型別
當方法中丟擲執行時異常時,方法定義中不需要throws宣告丟擲異常的型別,呼叫者不需要處理此異常,需要程式人員修改原始碼.
2、非執行時異常:如果出現了非執行時異常就必須進行處理,也就是必須進行丟擲處理或是捕獲處理,否則編譯器會報錯.
執行時異常例子:
public static int demomo(int a,int b) {//當方法內丟擲的是執行時異常的時候,方法宣告 if (b==0) { //異常的分類 可以分成執行時異常和非執行時異常 非執行時異常出現時,必須先處理異常,否則不能執行,編譯器會報錯. //當方法丟擲執行時異常的時候,方法定義中無須throws宣告,呼叫者無須去處理此異常,執行時異常一旦發生,需要程式人員修改原始碼 throw new ArithmeticException("除數為0");//這個異常型別就屬於執行時異常,所以這個方法宣告不用加throws來宣告丟擲異常型別 //throw是用於方法內部用於丟擲一個異常的,而throws是用於方法宣告上的,說明丟擲的異常型別 //而throw後面只能有一個異常物件,throws後面一次能夠宣告多個異常型別. } return a/b; }
自定義異常
雖然java的jdk中定義了許許多多的異常類,但是有時候還是需要用到自定義異常類
java中所有異常類都是繼承於Throwable,自定義類也一樣,這樣自定義類才能被throw丟擲.
每個異常中都呼叫了父類的構造方法,把異常描述資訊傳遞給了父類,讓父類幫使用者進行異常資訊的封裝.
語法:
Class 異常名 extends Exception //繼承RuntimeException 執行時異常 { public 異常名(){//無參構造方法 } public 異常名(String s){//有參構造方法,s為該異常的詳細資訊 super(s);//將詳細資訊傳遞給父類封裝 } }
異常在重寫之中的運用
1、子類覆蓋父類的方法時,如果父類的方法宣告異常,子類只能宣告父類異常或者該異常的子類,或者不宣告異常.
2、當父類方法宣告多個異常時,子類覆蓋時只能宣告多個異常的子集.
3、當被覆蓋的方法沒有異常宣告時,子類覆蓋時無法宣告異常.
4、父類中沒有宣告異常,而實現的子類覆蓋方法發生了異常,無法進行throws宣告,只能catch捕獲處理,如果問題處理不了,catch中繼續使用RuntimeException子型別的異常丟擲.
課後習題1、異常與錯誤的區別是什麼?
異常是程式在編譯、執行期間發生的某種異常(Exception),若不處理異常,程式會結束執行
錯誤是程式在執行期間發生的某種錯誤(Error)、程式將會結束執行,Error錯誤發生往往都是系統級別的問題,是jvm所在系統發生並反饋給jvm的.
2、異常有哪幾類別?
有倆種,分為執行時異常和非執行時異常.非執行時異常發生的時候,必須要進丟擲或捕獲處理,否則編輯器會報錯,
而執行時異常,呼叫者不需要處理此異常,需要程式人員修改原始碼.方法丟擲執行時異常時.方法定義無須throws宣告丟擲異常型別
3、異常常用的有哪幾種處理方式?
常用的有捕獲處理和丟擲處理