1. 程式人生 > >27、異常的基本概念和處理流程

27、異常的基本概念和處理流程

學習目標:

1、瞭解Java異常的基本概念

2、瞭解異常的使用場景

3、掌握異常的基本語法結構

學習過程:

一、異常的基本概念

在java中把導致程式中斷執行的情況分為兩種,一種就是異常,而另外一種叫做錯誤。所有異常的基類是Exception,錯誤的基類是Error。Exception是在java程式中可以編碼進行控制的,具有可程式設計性,而Error是指Java執行時系統來顯示與執行時系統本身有關的錯誤,Error對於程式設計師來說是災難性的,程式無法控制,比如jvm堆疊溢位錯誤,作業系統分配記憶體錯誤等。不管是Exception還是Error,他們的共同父類是java.lang.Throwable(可丟擲的) 類。

 異常是指在程式執行期可能出現的非正常情況,這些情況將導致程式出錯,這種出錯不同於程式碼編寫錯誤或程式演算法出錯,程式碼編寫錯誤無法完成編譯,而程式演算法出錯計算將取得錯誤的結果。程式出現異常時,預設會直接造成程式的中斷執行,提前預知這種異常的可能性可以補充異常處理的邏輯,從這個角度出發,異常也是一種行之有效的邏輯處理機制,在程式中宣告異常或主動丟擲異常也很常見。

簡而言之,為了提高程式的健壯性,異常需要由程式設計師處理。

二、異常的作用和處理流程

1、什麼時候需要捕獲異常

我們先看看下面的程式碼:

1

2

3

4

5

6

7

8

9

10

11

public class Cal {

    public int div(int a, int b) {

        int result = a / b;

        return result;

    

}

    public static void main(String[] args) {

        Cal cal=new Cal();

        int result=cal.div(102);

        System.out.println("結果:"+result);

    }

}

在這裡我們設計了Cal類和它的div方法,用於計算兩個數的商,在main方法中我們呼叫這個方法,可以正常的輸出:結果:5;但是如果使用者用下面的程式碼呼叫(注意:除數為0。)

1

2

3

4

5

public static void main(String[] args) {

        Cal cal=new Cal();

        int result=cal.div(100);

        System.out.println("結果:"+result);

    }

程式的語法是沒有問題的,但是程式確沒有能正常顯示結果,控制檯輸出如下:

attcontent/3d4b54d6-62a6-4247-b8e6-da44ca5722f9.png

程式因為異常而終止,導致程式並沒有輸出,這個異常應該由程式設計師顯示捕獲,以調程式的健壯性。

2、處理流程和關鍵字介紹

異常處理主要使用的關鍵字是:try、catch、finaly、throw、throws。其功能如下所示:

attcontent/7ead6da2-09fe-48a3-9cb0-6677eed937a1.png

由上圖可知try、catch、finally常常組合使用,finally是可選的,但是try和catch必須一起使用。其執行流程如下圖所示:

 

attcontent/1376e0bc-31d3-46c3-ba26-8e57997d2f50.png

具體語法格式是:

try{

   可能出現異常的程式碼

}catch(異常類  物件){

   出現異常後的處理,如果沒有出現異常,這裡是不會進入的。

}finally{

   不管有沒有異常都會在最後執行的程式碼。

}

那麼修改上面的main方法。先看看沒有異常時候的輸出。程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

public static void main(String[] args) {

        Cal cal=new Cal();

        try{

            int result=cal.div(102);

            System.out.println("結果:"+result);

        }catch (Exception e) {

            System.out.println("發生異常了。");

        }finally{

            System.out.println("結束。");

        }

         

}

程式並沒有發生異常,所以catch的後面的語句塊沒有進入了,控制檯輸出如下圖:

attcontent/24db7a85-4cb3-4319-8750-ccae64869fe1.png

修改一下main方法,使除數為0。

1

2

3

4

5

6

7

8

9

10

11

12

public static void main(String[] args) {

        Cal cal=new Cal();

        try{

            int result=cal.div(100);//這一句發生了異常,後面的程式碼就不會

            System.out.println("結果:"+result);//這句沒有執行

        }catch (Exception e) {

            System.out.println("發生異常了。");//進入了異常處理

        }finally{

            System.out.println("結束。");//這句還是會執行

        }

         

}

控制檯輸出如下圖:

attcontent/53f30530-7b0a-422c-a751-433fff8176dd.png