22
Ch11 JAVA 福福福福福 福福福福福福福福 (II)

Ch11JAVA 的例外處理

Embed Size (px)

DESCRIPTION

Ch11JAVA 的例外處理. 物件導向程式設計 (2). 大綱. Java 的例外處理 例外處理的程式敘述 丟出例外 自訂 Exception 類別. Java 的例外處理. Java 語言的「例外」( Exception )是指產生了例外物件,這是一種例外事件,在程式執行時,發生不正常執行狀態時所產生事件的物件,「例外處理」( Handling Exceptions )就是在處理這些例外事件。 例外處理的目的是為了讓程式能夠更「強壯」( Robust ),當程式遇到不尋常情況,也不會造成程式「崩潰」( Crashing ),進而導致整個系統當機。. - PowerPoint PPT Presentation

Citation preview

Page 1: Ch11JAVA 的例外處理

福 春福

福福福 福

Ch11 JAVA的例外處理

物件導向程式設計 (II)

Page 2: Ch11JAVA 的例外處理

112/04/19 2

大綱• Java的例外處理• 例外處理的程式敘述• 丟出例外• 自訂 Exception類別

Page 3: Ch11JAVA 的例外處理

112/04/19 3

Java的例外處理

• Java語言的「例外」( Exception)是指產生了例外物件,這是一種例外事件,在程式執行時,發生不正常執行狀態時所產生事件的物件,「例外處理」( Handling Exceptions)就是在處理這些例外事件。

• 例外處理的目的是為了讓程式能夠更「強壯」( Robust),當程式遇到不尋常情況,也不會造成程式「崩潰」( Crashing),進而導致整個系統當機。

Page 4: Ch11JAVA 的例外處理

112/04/19 4

例外處理的架構 -說明• Java的例外處理架構是一種您丟我撿的架構,當 JVM執行 Java程式有錯誤發生時,就會產生例外物件,有了例外, JVM開始尋找是否有方法可以處理。–一種是在方法上加上例外處理的程式敘述來處理例外(在第 13-2節說明)。

–或是將例外丟給其它方法來處理(在第 13-3節說明)。

Page 5: Ch11JAVA 的例外處理

112/04/19 5

例外處理的架構 -圖例

Page 6: Ch11JAVA 的例外處理

112/04/19 6

例外處理的架構 -過程• 在執行 Java程式時,從main()方法呼叫

methodA()方法,接著呼叫methodB()方法,最後呼叫methodC()方法,呼叫過程是存入稱為「呼叫堆疊」( Call Stack),這是一種先進後出的資料結構,用來儲存呼叫方法的狀態資料,以便返回還原成呼叫時的狀態。

• 當methodC()方法發生錯誤產生例外物件A, JVM倒過來找尋方法是否擁有例外處理,首先是methodC()和methodB(),因為沒有例外處理,所以例外會傳遞給methodA(),在此方法擁有例外處理 A,所以可以處理例外物件 A。

Page 7: Ch11JAVA 的例外處理

112/04/19 7

Throwable類別 -說明• 在 Java產生的例外物件屬於 Throwable類別或其子類別的實例, Throwable類別擁有 2個直接繼承的子類別,如下所示:– Error類別:其子類別屬於 JVM的嚴重錯誤,這種錯誤會導致程式終止執行,所以並沒有辦法使用例外處理來處理這種錯誤。

– Exception類別:其子類別是各種例外物件,也是例外處理可以處理的部分,事實上,部分例外物件也是一種錯誤,只是錯誤沒有嚴重到需要終止程式執行,例外處理就是在防止程式終止執行,並且作一些補救操作。

Page 8: Ch11JAVA 的例外處理

112/04/19 8

Throwable類別 -說明• Exception類別擁有子類別

RuntimeException,在此類別的子類別是一些常見的例外,如下表所示:

例外 說明ArithmeticException 數學運算時產生的例外

ArrayIndexOutOfBoundsException 陣列索引值小於 0或超過陣列邊界所產生的例外

ArrayStoreException 儲存陣列元素時型態不符產生的例外IllegalArgumentException 方法呼叫時,參數型態不同產生的例

外NullPointerException 物件值為 null產生的例外

Page 9: Ch11JAVA 的例外處理

112/04/19 9

例外處理的程式敘述 -區塊架構• Java語言例外處理程式敘述分為

try、 catch、 finally三個程式區塊,可以處理特定的例外物件,如下所示:try

{ ……… }

catch(ExceptionType e)

{ // 例外處理 ……… }

finally

{ ……… }

Page 10: Ch11JAVA 的例外處理

112/04/19 10

例外處理的程式敘述 -try程式區塊try程式區塊• 在 try區塊的程式碼檢查是否產生例外,當例外產生時,就會丟出指定例外類型的物件。

Page 11: Ch11JAVA 的例外處理

112/04/19 11

例外處理的程式敘述 -catch程式區塊

catch程式區塊• 在 try程式區塊的程式碼如果丟出例外, Java程式需要準備一到多個 catch程式區塊處理不同類型的例外,傳入參數 e是例外類型的物件(繼承自 Throwable類別),可以取得例外的相關資訊,其相關方法如下表所示:

方法 說明String getMessage() 傳回例外說明字串

void printStackTrace() 顯示程式呼叫的執行過程

Page 12: Ch11JAVA 的例外處理

112/04/19 12

範例 1:例外處理 _除以零1. b1.addActionListener(new ActionListener()

2. { public void actionPerformed(ActionEvent evt)

3. {

4. String s1 = t1.getText();

5. int i1 = Integer.parseInt(s1);

6. int i2 = Integer.parseInt(t2.getText());

7. int ans = i1 / i2;

8. t3.setText(Integer.toString(ans));

9. }

10. } );

Page 13: Ch11JAVA 的例外處理

112/04/19 13

範例 1( 續 )1. b1.addActionListener(new ActionListener()2. { public void actionPerformed(ActionEvent evt)3. {4. try5. {6. String s1 = t1.getText();7. int i1 = Integer.parseInt(s1);8. int i2 = Integer.parseInt(t2.getText());9. int ans = i1/i2;10. t3.setText(Integer.toString(ans));11. }12. catch(ArithmeticException e)13. {14. t3.setText(e.getMessage());15. }16. }17. } );

Page 14: Ch11JAVA 的例外處理

112/04/19 14

例外處理的程式敘述 -finally程式區塊

finally程式區塊• finally程式區塊可有可無,主要是用來執行程式善後,不論例外是否產生,都會執行此區塊的程式碼。

Page 15: Ch11JAVA 的例外處理

112/04/19 15

同時處理多種例外

• 在 Java程式的 try/catch/finally程式敘述,可以使用多個 catch程式區塊來同時處理多種例外物件,如下所示:try{ }catch( ArithmeticException e ){ ……… }catch( ArrayIndexOutOfBoundsException e ){ ……… }finally { }

Page 16: Ch11JAVA 的例外處理

112/04/19 16

使用 throw程式敘述 -說明• Java程式碼可以使用 throw指令丟出例外,其語法如下所示:throw ThrowableObject;

• 上述 ThrowableObject是繼承自 Throwable類別的物件,表示丟出例外物件。

Page 17: Ch11JAVA 的例外處理

112/04/19 17

使用 throw程式敘述 -範例• 例如:在 Java程式丟出

ArithmeticException例外物件,如下所示:throw new ArithmeticException("值為 0");

• 上述程式碼使用 new運算子建立例外物件,建構子參數是讓 getMessage()方法取得的例外說明字串。

Page 18: Ch11JAVA 的例外處理

112/04/19 18

範例 2:方法本身丟出例外1. public class Ch12_042. { // 主程式3. public static void main(String[] args)4. { // 例外處理程式敘述5. try // 取得參數字串6. { int value = Integer.parseInt(args[0]);7. if ( value == 0 )8. // 丟出 ArithmeticException例外9. throw new ArithmeticException("值為 0");10. }11. catch( ArithmeticException e )12. { // 處理 ArithmeticException例外13. System.out.println("例外說明 : "+e.getMessage());14. System.out.print("例外原因 : ");15. e.printStackTrace();16. }17. finally18. { System.out.println("錯誤處理結束 "); }19. }20. }

Page 19: Ch11JAVA 的例外處理

112/04/19 19

在方法丟出例外• 在某些情況,雖然方法會產生例外,但是我們並不希望在此方法建立例外處理(通常是為了集中處理例外事件),此時,可以將例外丟出,讓呼叫此方法的其它方法接手處理例外,如下所示:

static double cal(double a,double b,double c) throws IllegalArgumentException{ ……… throw new IllegalArgumentException( "c不能是 0!"); ………}

Page 20: Ch11JAVA 的例外處理

112/04/19 20

範例 3:在方法丟出例外 ,由別的呼叫者處理

1. public class Ch12_052. { // 類別方法 : 計算 a*b/c的值3. static double cal(double a, double b, double c) 4. throws IllegalArgumentException5. { double value;6. if ( c == 0 )7. { // 丟出 IllegalArgumentException例外8. throw new IllegalArgumentException("c不能是 0!");9. } else {10. value = a*b/c;11. if ( value < 0 )12. { // 丟出 IllegalArgumentException例外13. throw new14. IllegalArgumentException("運算結果小於 0");15. }16. }17. return value;18. }19.

20. // 主程式21. public static void main(String[] args)22. { double result; 23. try // 取得參數值24. { double a = Double.parseDouble(args[0]);25. double b = Double.parseDouble(args[1]);26. double c = Double.parseDouble(args[2]);27. result = cal(a, b, c); // 呼叫方法28. System.out.println("計算結果 : " + result);29. }30. catch( IllegalArgumentException e )31. { // 處理 IllegalArgumentException例外32. System.out.println("例外說明 : "+e.getMessage());33. System.out.print("例外原因 : ");34. e.printStackTrace();35. }36. catch( ArrayIndexOutOfBoundsException e )37. { System.out.println(e.getMessage()); 38. e.printStackTrace();39. }40. }41. }

Page 21: Ch11JAVA 的例外處理

112/04/19 21

自訂 Exception類別• 在 Java程式除了使用現成 Exception類別的例外,也可以自訂 Exception類別建立應用程式所需的例外類別,如下所示:

class UserException extends Exception{ int data; public UserException(int data) { this.data = data; } public String getMessage() { return ("錯誤 ! 出價太多次 : " + data); }}

Page 22: Ch11JAVA 的例外處理

112/04/19 22

範例 4:自訂 Exception類別1. // 自訂 Exception類別 , 繼承 Exception類別2. class UserException extends Exception3. { // 變數宣告4. int data;5. // 建構子6. public UserException(int data)7. { this.data = data; }8. // 覆寫 getMessaeg()方法9. public String getMessage()10. { return ("錯誤 ! 出價太多次 : " + data); }11. }

12. // 主程式類別13. public class Ch12_0614. { // 主程式15. public static void main(String[] args)16. { try17. { int i;18. for ( i = 0; i < 5; i++ )19. { if (i == 3) // 丟出自訂的例外20. throw new UserException(3);21. System.out.println("出價次數 : " + i);22. }23. }24. catch( UserException e)25. { // 處理自訂的例外26. System.out.println("例外說明 : "+e.getMessage());27. System.out.print("例外原因 : ");28. e.printStackTrace();29. return;30. }31. finally32. { System.out.println("錯誤處理結束 !"); }33. System.out.println("程式結束 !");34. }35. }