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

 

10-3 自訂擲出例外 - throws

內容:

  • 10-3-1 throws 語法

  • 10-3-2 範例研討:throws ArithmeticException

  • 10-3-3 範例研討:throws IOException

10-3-1 throws 語法

吾人可將某一類別內方法所發生的例外事件,歸納於某一例外物件內,在管理方面也許比較容易,則在主方法內捕抓例外事件 (try {…} catch () { …}),其他方法則將事件擲出即可,不用再 try .. catch 命令擷取,如以下語法,說明如下:

(1) 在主方法內利用 try .. catch 擷取 Exception_1 例外事件

(2) 方法 meth_1 meth_2 try 監視範圍內

(3) 方法 meth_1 meth_2 在宣告語句內加入 throws Exception_1,表示有任何例外事件,則擲出到 Exception_1 物件內。

(4) 在方法監督事件發生就不需要 try … catch 捕抓直接 throw new Exception_1 (“ Message”) 即可,其中 Message 表示顯示擲出訊息。

(5) 其中 Exception_1 例外物件必須是Exception Error 類別下物件

public class UsingException {

public static void main(String args[]) {

…..;

try {

meth_1();

……;

meth_2();

……;

}

catch ( Exception_1  except1) {

System.out.printf(“%s\n”, except1.getMessage());

}

}

public static void meth_1(..) throws Exception_1 {

…;

throw new Exception_1(“Message_1”);

….;

}

public static void meth_2(..) throws Exception_1 {

…;

throw new Exception_1(“Message_2”);

….;

}

}

10-3-2 範例研討:throws ArithmeticException

A)程式範例:Ex10_4.java

吾人用一個範例(Ex10_4.java)來說明自訂擲出例外物件。在主方法內捕抓 ArithmeticException,其他方法則將例外事件丟到該物件內,程式範例如下:

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

42

43

//Ex10_4.java

import java.util.*;

public class Ex10_4 {

    public static void main(String args[]) {

        Scanner keyin = new Scanner(System.in);

        int k;

                try {

                        System.out.printf("請輸入 10 ~ 20 之間的數 =>");

                        k = keyin.nextInt();

                        System.out.printf("輸入值為:%d\n", rangeTest(k)); // 執行方法成員

                        int x=20, y=2, m;

                        System.out.printf("請輸入 %d/%d =>", x, y);

                        m = keyin.nextInt();

                        if (divTest(x, y, m) ==1)             // 執行方法成員

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

                }

        catch(ArithmeticException except1){

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

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

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

                }

     }

         public static int rangeTest(int k) throws ArithmeticException  // 方法成員

                 if (k <10 || k>20)

                                throw new ArithmeticException("輸入不在範圍內");

                return k;

         }

         public static int divTest(int x, int y, int m) throws ArithmeticException{  //方法成員

                 if (m != x/y)

                                throw new ArithmeticException("除的結果不對");

                else

                        return 1;

         }

}

B)執行結果:

D:\Java2_book\chap10>java Ex10_4        [正常輸入]

請輸入 10 ~ 20 之間的數 =>12

輸入值為:12

請輸入 20/2 =>10

正確

 

D:\Java2_book\chap10>java Ex10_4   [輸入範圍不對拋出 ArithmeticException]

請輸入 10 ~ 20 之間的數 =>4

Catch ArithmeticException

java.lang.ArithmeticException: 輸入不在範圍內

輸入不在範圍內

 

D:\Java2_book\chap10>java Ex10_4    [除結果不對拋出 ArithmeticException]

請輸入 10 ~ 20 之間的數 =>13

輸入值為:13

請輸入 20/2 =>5

Catch ArithmeticException

java.lang.ArithmeticException: 除的結果不對

除的結果不對

 10-3-3 範例研討:throws IOException

目前非常普遍利用 Java 來開發應用程式,對於輸入/輸出處理最為頭痛,時常會發生例外事件。尤其最常見的 App或視窗的人機介面處理。Java 為了方便程式開發者,在 Java.io.IOException 套件裡宣告了許多例外事件,只要將它宣告擲入 (throws IOException),就不需要利用 try {…} 區塊來捕抓例外事件產生。

(A) 程式範例:Ex10_5.java

此範例係利用 try {….} 區塊來捕抓例外事件發生。程式功能是利用串流方式由檔案 test.txt 讀取資料,再依序輸出到螢幕上,如果 test.txt 不存在,則發生例外事件。程式範例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

import java.io.*;

 

public class Ex10_5 {

        public static void main (String[] args) {

                FileInputStream fis = null;

                int i=0;

                char c;

                try{

                        File file = new File("test.txt");

                        fis = new FileInputStream(file);

                        while ((i=fis.read()) != -1) {

                                c = (char)i;

                                System.out.print(c);

                        }

                }catch (IOException e){                       

                        e.printStackTrace();

                }

        }

       

}

(B) 執行結果:

(1) 檔案不存在,則執行結果如下:

D:\Java2_book\chap10>java Ex10_5

java.io.FileNotFoundException: test.txt (系統找不到指定的檔案。)

        at java.io.FileInputStream.open0(Native Method)

        at java.io.FileInputStream.open(Unknown Source)

        at java.io.FileInputStream.<init>(Unknown Source)

        at Ex10_5.main(Ex10_5.java:10)

(2) 檔案存在,則執行結果如下:

D:\Java2_book\chap10>java Ex10_5

Good Luck To You

(C) 程式範例:Ex10_6.java

如果,我們在方法前面宣告 throws IOException,則不須利用 try {….} 區塊來捕抓例外事件發生,程式範例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

import java.io.*;

 

public class Ex10_6 {

        public static void main (String[] args) throws IOException {

                FileInputStream fis = null;

                int i=0;

                char c;

                File file = new File("test.txt");

                fis = new FileInputStream(file);

                while ((i=fis.read()) != -1) {

                        c = (char)i;

                        System.out.print(c);

                }

        }

       

}

(D) 執行結果:

(1) 檔案不存在,則執行結果如下:

D:\Java2_book\chap10>java Ex10_6

Exception in thread "main" java.io.FileNotFoundException: test.txt (系統找不到指定的檔案。)

        at java.io.FileInputStream.open0(Native Method)

        at java.io.FileInputStream.open(Unknown Source)

        at java.io.FileInputStream.<init>(Unknown Source)

        at Ex10_6.main(Ex10_6.java:10)

(2) 檔案存在,則執行結果如下:

D:\Java2_book\chap10>java Ex10_6

Good Luck To You

 

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: