異常以及異常處理
異常概述
異常:異常是指在程式的執行過程中所發生的不正常的事件,它會中斷正在執行的程式。簡單來說就是程式出現了不正常的情況。
異常本質就是Java當中對可能出現的問題進行描述的一種物件體現。
常見異常:
除數不能為0異常(ArithmeticException)
空指標異常(NullPointException)
陣列越界異常(ArrayIndexOutOfBoundsException)
型別轉換異常(ClassCastException)
異常分類
Error:稱為錯誤,由Java虛擬機器生成並丟擲,程式對其不做處理。
Exception:所有異常類的父類,其子類對應了各種各樣可能出現的異常事件,一般需要使用者顯示的宣告或捕獲。
RuntimeException:執行時期異常,又稱為非受檢異常,RuntimeException及其所有子類都是執行時期異常。
編譯時期異常:不是繼承自RuntimeException的Exception的子類都稱為編譯時期異常。
嚴重錯誤: 在程式執行的整個階段,都可發生錯誤,錯誤是無法解決的,可以避免,例如: StackOverflow
遇到異常,是如何處理的呢?
處理異常的目的: 並不是為了修復程式的錯誤,而是就算程式出現了錯誤,也能夠讓程式繼續執行
jvm預設是如何處理異常的?
以下段編碼為例:
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
public static void show() {
show();
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.kookv.kookv0425.main(kookv0425.java:8)
1.列印錯誤資訊
a.異常名稱 java.lang.ArithmeticException
b.異常的訊息 / by zero
c.異常所發生的方法位置 at com.kookv.kookv0425.main
d.異常所在Java檔案中 kookv0425.java
e.異常發生行號 8
2.終止程式
System.exit(0);
當JVM處理異常的方式不能夠滿足我們開發的需求,就需要我們自己處理異常。
我們自己如何來處理異常呢?
方式一: try...catch..finally
方式二: throws
處理異常方式一格式:
try{
//程式可能出現問題的程式碼
}catch(異常類 異常名){
//異常處理的程式碼
} finally{
//釋放資源
}
注意:
1.try塊區的程式碼越少越好。
2.try塊中一旦發生異常,那麼後面所有的程式碼都不會被執行。
3.多個catch塊只會執行一個。
4.Exception接受異常必須放在異常的最後面,滿足先子類後父類。
異常的執行流程:
1.程式執行到錯誤行,系統會建立一個異常物件,並且拋給我們:
ArithmeticException exp = new ArithmeticException("/by zero");
throw exp;
2.程式進入catch塊進行逐個匹配
匹配成功,程式執行catch塊程式碼
ArithmeticException ae = exp;
Exception e = exp;
匹配失敗,交給jvm處理
處理異常的標準方式:
1.能夠顯示處理的儘量顯示處理,提高程式的可讀性。
2.但是一定要在異常處理的最後加上 父類Exception處理。
Throwable類
1.Throwable是所有異常和錯誤的父類。
2.只有作為Throwable或者它的子類物件才能夠由Java虛擬機器丟擲,或者可以由Java throw語句丟擲
3.只有這個類或其子類可以是catch子句中的引數型別
4.異常的本質就是對錯誤資訊的一種物件體現
throws關鍵字概述
在定義一個方法的時候可以使用throws關鍵字宣告,使用throws宣告的方法表示此方法不處理異常,而交給方法的呼叫者進行處理。
throws使用格式
[修飾符] 返回值型別 方法名(引數列表) [throws 異常類1,異常類2....]{
}
注意:
1.在main方法中,不能throws丟擲。因為main方法是虛擬機器呼叫,虛擬機器處理異常的結果是將程式終止,不滿足我們對處理異常的本質需求。
2.當一個方法丟擲的是編譯時異常,呼叫者必須處理。
3.throws可以同時宣告多個異常。
4.當一個父類方法丟擲一個異常,重寫方法不能夠被擴大。
5.throws表示異常出現的一種可能性。
6.多個平級異常的處理方式:使用“,”隔開多個異常。
throw和throws的區別
有了throws關鍵字為什麼需要throw? -- 異常出現的情況做相應的處理,throws只是一種異常的宣告
丟擲異常物件: throw 異常物件;
throws和throw的區別:
1.throws出現方法的宣告上,throw出現在方法體內。
2.throws表示異常出現的一種可能性,throw表示方法一定出現了異常。
3.throws可以宣告很多個異常,throw只能夠丟擲一個異常物件。
4.throws宣告的是異常類,throw丟擲的是異常物件。
finally修飾的程式碼塊一定會被執行,除非在執行到finally之前程式異常退出或者呼叫了系統退出的方法。
finally用於釋放資源,在IO流操作和資料庫操作中會見到。
finally相關的面試題
簡述final,finally和finalize的區別。
finally碰到return
finally一定會執行
執行順序?
在try語句中,在執行return語句時,要返回的結果已經準備好了,就在此時,程式轉到finally執行了。
在轉去之前,try中先把要返回的結果存放到不同於x的區域性變數中去,執行完finally之後,在從中取出返回結果。
因此,即使finally中對變數x進行了改變,但是不會影響返回結果。它應該使用棧儲存返回值。
為什麼需要自定義異常?
1.系統提供的異常不能滿足我們的所有需求。
2.我們認為的異常並不是和別人認為的異常一樣,本質就是一種錯誤異常。
自定義分數異常: 自定義一個異常,要求考試成績必須在0-100之間,如果不在這個範圍內,丟擲異常。
自定義異常的步驟
1.自定義異常必須是Throwable的子類,但又因為錯誤不能夠處理,所以我們一般繼承Exception或者RuntimeExecption
2.書寫構造方法
a.無參構造方法
b.帶message訊息的