Java 程式設計()  第 十章 例外處理      下一頁

 

第十章 例外處理

10-1 例外處理簡介

內容:

  • 10-1-1 何謂例外處理

  • 10-1-2 例外處理的語法

  • 10-1-3 範例研討:簡單捕抓異常現象

10-1-1 何謂例外處理

程式執行當中,遇到異常狀況讓程式無法繼續執行時,系統必須有適當的處置,此處理狀況稱之為『例外處理』(Exception),較常見的異常狀況有:

(1) I/O 處理』時發生異常狀況:譬如開啟某依檔案,但該檔案並不存在,而讓系統無法繼續執行時,所應處理的例外處理。

(2) 『運算處理』時發生異常狀況:譬如除數分母為 0 時。

(3) 『陣列處理』時發生異常狀況:陣列索引值超過陣列大小範圍,或索引值為負值時。

(4) 『資料形態處理』時發生異常狀況:譬如須由鍵盤讀入整數,但輸入為非數字時。

java 規範裡異常狀態有分為『例外』(Exception)『錯誤』(Error),一般來講例外是表示異常狀態較輕微的現象,而錯誤則表示較嚴重的現象。兩者皆宣告於Java.lang 類別下Exception 類別較常用的有:

Java.lang.Exception

        

ArrayIndexOutOfBoundsExceptuin

陣列索引值超過範圍。

NegativeArraySizeException

陣列索引值為負值。

IllegalAccessException

資料型態存取不正確。

IOException

存取輸入/輸出裝置不正確。

NoSuchFieldException

載入類別檔案的欄位不正確。

NumberFormatException

數字格式不正確。

ArithmeticException

數學運算不正確。

RuntimeException

JVM 執行當中所發生的錯誤皆是。

另外,較常用的 Error 類別有:

Java.lang.Error

        

ClassFormatError

導入的類別型態錯誤。

Error

所有可 Throwable 的錯誤。

IllegalAccessError

不合法的存取錯誤。

VirtualMachineError

虛擬機執行錯誤。

OutOfMemoryError

超出記憶體範圍錯誤。

NoSuchMethodError

缺少方法成員錯誤。

還有許多相關 Exception Error 類別,請自行參閱 Java DOC

10-1-2 例外處理的語法

Java 例外處理的語法如下:

try {

     // 監視可能發生異常現象的程式區塊

}

catch (例外類別_1 例外物件_1) {

     // 捕抓到例外事件_1,程式執行區塊

}

catch (例外類別_2 例外物件_2)

    // 捕抓到例外事件_2,程式執行區塊

}

….

finally {

    // 無論是否捕抓到例外事件,皆必須執行的城市區塊

}

(1) try 區塊:此區塊程式在執行當中,被監視是否發生例外事件。

(2) catch (事件類別_1 事件物件_1) 區塊:當try 區塊內執行當中,發生例外事件_1 時,則被捕抓到,並執行此區塊內程式。

(3) final 區塊:無論是否捕抓到例外事件,此區塊都要執行。

10-1-3 範例研討:簡單捕抓異常現象

A)程式範例:Ex10_1.java

我們用一個程式來驗證 NumberFormatException ArrayIndexOutOfBoundsException 兩例外類別的運用,前者表示輸入數字資料格式不對發生例外事件,後者陣列指標超過範圍,程式範例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

//Ex10_1.java

import java.util.*;

public class Ex10_1 {

    public static void main(String args[]) {

        Scanner keyin = new Scanner(System.in);

        double fract;  //分數;

        double numer; // 分子

        double demo; // 分母

        int data[] = {1, 2, 3, 4, 5, 6, 7};

         int point;

         try {

                        System.out.printf("請輸入除數的分子 =>");

                        numer = keyin.nextDouble();

                        System.out.printf("請輸入除數的分母 =>");

                        demo = keyin.nextDouble();

                        fract = numer / demo;

                        System.out.printf("\n");

                        System.out.printf("%.2f/%.2f = %.2f\n", numer,demo,fract);

                        System.out.printf("請輸入幾個陣列元素輸出 =>");

                        point = keyin.nextInt();

                        for (int i=0; i<point; i++)

                                System.out.printf("%d  ", data[i]);

                        System.out.printf("\n");

         }

        catch(InputMismatchException except1){

                        System.out.printf("Catch NumberFormatException\n");

                        System.out.printf("%s\n", except1.toString());

         }

        catch(ArrayIndexOutOfBoundsException except2){

                        System.out.printf("Catch ArrayIndexOutOfBoundsException\n");

                        System.out.printf("%s\n", except2.toString());

         }

         finally {

                        System.out.println("Program finally");

          }

     }

}

(A) 執行結果

(1) 正常現象,兩數輸入正確,輸出兩數箱除結果,陣列指標輸入在陣列元素內,但最後 finally 敘述皆會執行,如下:

D:\Java2_book\chap10>java Ex10_1

請輸入除數的分子 =>5

請輸入除數的分母 =>4

5.00/4.00 = 1.25

請輸入幾個陣列元素輸出 =>3

1  2  3

Program finally

(2) 當數字輸入不正確,而輸入字元時,發生補抓到 NumberFormatException 異常現象,如下:

D:\Java2_book\chap10>java Ex10_1

請輸入除數的分子 =>5

請輸入除數的分母 =>t

Catch NumberFormatException

java.util.InputMismatchException

Program finally

(3) 當陣列指標超過範圍時,則捕抓到 ArrayIndexOutOfBoundsException 異常現象,如下:

D:\Java2_book\chap10>java Ex10_1

請輸入除數的分子 =>3

請輸入除數的分母 =>1

 

3.00/1.00 = 3.00

請輸入幾個陣列元素輸出 =>8

1  2  3  4  5  6  7  Catch ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: 7

Program finally

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: