1. 程式人生 > >異常以及異常處理

異常以及異常處理

異常概述

異常:異常是指在程式的執行過程中所發生的不正常的事件,它會中斷正在執行的程式。簡單來說就是程式出現了不正常的情況。

異常本質就是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訊息的