Download presentation
Presentation is loading. Please wait.
1
例外處理
2
內 容 大 綱 例外的產生 捕捉例外 丟出例外
3
例外的產生 (1/4) 一般常見的執行時期錯誤包括整數除法分母為 0(divide by zero) ,陣列索引值越限 (array index out of range) ,輸入輸出錯誤 (I/O error) 、檔案 不存在或無法存取 (noexistent or inaccessible file) 等。 Java 語言則提供一個處理執行時期錯誤的機制, 稱為例外處理 (exception handling) ,此機制讓使 用者可以「嘗試 (try) 」著去「捕捉 (catch) 」到執 行時期錯誤,並直接加以處理,以避免程式因為 執行時期的錯誤而立即停止。
4
例外的產生 (2/4) 程式執行時期的錯誤在 Java 語言中稱為例外 (exception) ,它們被視為物件,當程式於執行 時期產生錯誤時,一個對應的例外物件會被產 生出來,這在 Java 語言的術語裡稱為「有一個 例外被丟出 (throw) 了」。 當一個例外被丟出時若未能立即被捕捉 (catch) 並加以處理,則程式的執行會立即終止。 所有的例外相關類別都是由 java.lang 類別庫的 Throwable( 可丟出的 ) 類別衍生出來的。
5
例外的產生 (3/4) 由類別 Throwable 衍生出來的主要例外相關類別 繼承階層架構:
6
例外的產生 (4/4) 1: // 檔名 : 例外處理範例 1.java 2: // 說明 : 此程式可測試例外的產生情形// 說明 : 此程式可測試例外的產生情形 3: class 例外處理範例 1 { 4: public static void main (String[] 參數 ){ 5: int 整數 1=100, 整數 2=0, 整數 3; 6: System.out.println( 整數 1+ ” / ” + 整數 2); 7: 整數 3= 整數 1/ 整數 2; 8: System.out.println( ” = ” + 整數 3); 9: } // 方法 :main() 定義區塊結束 10: }// 類別 : 例外處理範例 1 程式執行結果 程式執行結果
7
捕捉例外 (1/6) 程式執行時期產生錯誤時,系統會根據錯誤的狀 況丟出一個對應的例外。 當一個例外被丟出時若未能立即被捕捉 (catch) 並 加以處理,則程式的執行會立即終止。 Java 語言中與例外捕捉與處理相關的關鍵字有 3 個: try 、 catch 與 finally 。
8
捕捉例外 (2/6) 例外捕捉與處理的一般形式如下所示: try{ 要監視例外產生的程式碼區塊 … } catch( 例外類別甲 例外 1){ 屬於例外類別甲的例外發生時執行的程式碼區塊 … } catch( 例外類別乙 例外 2){ 屬於例外類別乙的例外發生時執行的程式碼區塊 … } … finally{ 不論發生什麼例外或是例外根本沒有發生都要執行的程式碼區塊 … }
9
捕捉例外 (3/6) 上列例外捕捉與處理一般形式的用法如下: 將要監視例外產生的程式碼區塊置放於 try 關鍵字 之後的配對大刮號中,以便監控此程式碼區塊所 產生的任何例外。 將例外產生時要執行的程式碼置放於 catch 關鍵 字之後的配對大括號中,若所監視的程式碼區塊 發生的例外所屬的類別與 catch 關鍵字後小括號 中的類別相符,則配對大括號中的程式碼將會執 行。
10
捕捉例外 (4/6) 至於不論發生什麼例外或是例外根本沒有發生都 要執行的程式碼區塊則置放於 finally 後的配對大 括號中。 提示
11
捕捉例外 (5/6) 1: // 檔名 : 例外處理範例 2.java 2: // 說明 : 此程式可測試例外的產生情形// 說明 : 此程式可測試例外的產生情形 3: class 例外處理範例 2 { 4: public static void main(String[] 參數 ) { 5: int[] 陣列 ={0,1,2,3,4}; 6: int 編號 =(int)(Math.random()*10); 7: int 整數 1=(int)(Math.random()*100); 8: int 整數 2=(int)(Math.random()*2); 9: try { 10: System.out.println( 整數 1+"/"+ 整數 2); 11: int 整數 3= 整數 1/ 整數 2; 12: System.out.println("="+ 整數 3); 13: System.out.println( “ 陣列編號為 ” + 編號 + “ 的元素之值為 ");
12
捕捉例外 (6/6) 14: System.out.println( 陣列 [ 編號 ]); 15: } 16: catch (ArithmeticException 例外 ) { 17: System.out.println(" 算數例外產生 "+ 例外 ); 18: } 19: catch (ArrayIndexOutOfBoundsException 例外 ) 20: System.out.println(" 陣列索引越限例外產生 "+ 例外 ); 21: } 22: finally { 23: System.out.println( “ 不論產生什麼例外或是根本沒有例外產生皆 會列出此訊息 "); 24: } 說明 25: } // 方法 :main() 定義區塊結束 26: } // 類別 : 例外處理範例 2 定義區塊結束 程式執行結果 程式執行結果
13
丟出例外 (1/10) 在 Java 語言執行時,如果有一個執行時期錯誤發 生,則會有一個例外被丟出 (throw) 。 除了這種因為執行時期錯誤發生而由系統自動丟 出的例外之外,我們也可以透過程式碼,故意丟 出自己預設的例外。
14
丟出例外 (2/10) 我們使用 throw 關鍵字構成 throw 敘述來故意丟出一個例 外,當我們這麼做時,就必須另外於包含 throw 敘述的 方法的宣告部分使用 throws 關鍵字來表明方法執行時會 故意丟出什麼例外。 throw 及 throws 關鍵字的用法如下所示: 某方法 (……)throws 例外 1, 例外 2,……{ … throw new 例外 1(); throw new 例外 2(); … }
15
丟出例外 (3/10) 除了故意丟出的例外必須用 throws 關鍵字述明外, 有許多系統內建的例外也必須用 throws 關鍵字宣 告其發生之可能,唯有 RuntimeException 類別及 Error 類別的衍生例外類別不需要用 throws 關鍵字 宣告可能的丟出。 不需要於方法開始處宣告的例外,稱為不檢查 (unchecked) 例外,需要於方法開始處宣告的例 外,稱為檢查 (checked) 例外。 RuntimeException 類別及 Error 類別的衍生例外類 別都是不檢查例外。 Error 類別
16
丟出例外 (4/10) 表 11-1 是所有定義於 java.lang 類別庫中所有的例 外相關類別,請注意其中有一些是不檢查例外, 有些是檢查例外。
19
丟出例外 (5/10) 所有的例外類別都是 Throwable 的子類別, Throwable 類別的建構方法摘要如下所列: Throwable 類別建構方法摘要 Throwable() 建立一個 Throwable 例外物件,此例外物件沒有附加的說明訊息 Throwable(String 說明訊息 ) 建立一個 Throwable 例外物件,此例外物件的附加說明訊息為說明訊息
20
丟出例外 (6/10) Throwable 類別常用方法摘要 String getMessage() 傳回 Throwable 物件的附加說明訊息,若無附加說明訊息則傳回 null void printStackTrace() 追蹤執行堆疊並將其結果由標準的錯誤輸出設備印出 void printStackTrace(PrintStream 列印資料流設備 ) 追蹤執行堆疊並將其結果由指定的列印資料流設備印出
21
丟出例外 (7/10) 我們知道除了使用 throw new 某例外 (); 來丟出一個例外之外,我們也可以可使用 throw new 某例外 (” 此字串為例外的附加說明訊 息 ”); 來產生一個附帶說明訊息的例外物件某例外,例 外的說明訊息可以使用 getMessage 方法來取得 說明訊息。
22
丟出例外 (8/10) 1: // 檔名 : 例外處理範例 3.java 2: // 說明 : 此程式可測試例外的產生情形 3: class 例外處理範例 3 { 4: public static void main(String[] 參數 ) { 5: try { 6: 產生例外方法 (); 7: } // 敘述 :try 定義區塊結束 8: catch ( 自行定義例外 1 例外 ) { 9: System.out.println(" 例外產生 : "+ 例外 ); 10: } 11: catch ( 自行定義例外 2 例外 ) { 12: System.out.println(" 例外產生 : "+ 例外 ); 13: }
23
丟出例外 (9/10) 14: finally { 15: System.out.println(" 不論產生什麼例外或是根本沒有例外產生皆會列 出此訊息 "); 16: } 17: } // 方法 :main() 定義區塊結束 18: static void 產生例外方法 () throws 自行定義例外 1, 自行定義例外 2 { 19: int 整數 =(int)(1+Math.random()*2); // 整數 =1 或 2 的機率均等 20: System.out.println(" 整數之值為 "+ 整數 ); 21: if ( 整數 ==1) 22: throw new 自行定義例外 1(); 23: else 24: throw new 自行定義例外 2(" 這是自行定義例外 2 的說明訊息 "); 25: } // 建構方法 : 產生例外方法 () 定義區塊結束 26: } // 類別 : 例外處理範例 3 定義區塊結束
24
丟出例外 (10/10) 27: class 自行定義例外 1 extends Exception { } 28: class 自行定義例外 2 extends Exception { 29: 自行定義例外 2(String 說明訊息 ) { 30: super( 說明訊息 ); 31: } // 方法 : 32: } // 類別 : 自行定義例外 2 定義區塊結束 程式執行結果
25
Q&A
26
程式執行結果 ( 範例 11-1.)
27
程式執行結果 ( 範例 11-2.)
28
程式執行結果 ( 範例 11-3.)
29
程式說明 ( 範例 11-1.) 第 7 行中,因為變數 2 為 0 而且它是除式整數 1/ 整數 2 的分 母,整數除法算數運算中分母為 0 會引發一個 ArithmeticException 的例外,因為我們沒有「嘗試 (try) 」 加以「捕捉 (catch) 」這個例外,在執行第 7 行時程式的 執行中止,並出現以下訊息: java.lang.ArithematicException : /by zero at 例外處理範例 1.main( 例外處理範例 1.java:7) 這個訊息是說,當執行到類別例外處理範例 1 的 main 方 法時,因為碰到 ”/by zero” 的錯誤情形,因此系統丟出 一個屬於 java.lang 類別庫的 ArithematicException 例外, 而產生此錯誤情形的敘述位於例外處理範例 1.java 程式 檔案中的第 7 行。
30
程式說明 ( 範例 11-2.) 在範例程式 11-2 中我們嘗試著以第 16-18 行 catch (ArithmeticException 例外 ) {…} 捕捉整數除法分母為 0(divide by zero) 的算數運 算例外,並嘗試以 第 19-21 行 catch (ArrayIndexOutOfBoundsException 例外 ) {…} 捕捉陣列索引值越限 (array index out of range) 例外。
31
註解: Error 類別 Error 類別及其衍生類別所對應的錯誤狀況都是比 較嚴重的,應用程式通常無法處理 Error 類別及其 衍生類別所對應的錯誤狀況,因此,應用程式不 需要於方法開始處以 throws 敘述表示 Error 類別及 其衍生類別所對應錯誤狀況產生的可能性。一般 而言, Error 類別及其衍生類別被丟出後程式即停 止執行。
32
提 示 當有例外產生而此例外與許多 catch 敘述都符合時, 以第一個碰到的 catch 敘述來捕捉此例外。
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.