320 likes | 448 Views
第十五章 例外處理. 迴圈. 15.1 關於程式錯誤. 範例:應用程式的例外. 9 個元素值的陣列. intElement=intArray[9] ;. 9 超出陣列索引範圍. Exception in thread "main" java.lang. ArrayIndexOutOfBoundsException: 9 at GException.main(GException.java:11). 15.1 關於程式錯誤. 程式錯誤種類. 編譯時期的錯誤 執行時期的錯誤. 邏輯錯誤 特定的應用程式例外 系統錯誤.
E N D
第十五章 例外處理 迴圈
15.1 關於程式錯誤 範例:應用程式的例外 9 個元素值的陣列 intElement=intArray[9] ; 9 超出陣列索引範圍 Exception in thread "main" java.lang. ArrayIndexOutOfBoundsException: 9 at GException.main(GException.java:11)
15.1 關於程式錯誤 程式錯誤種類 編譯時期的錯誤 執行時期的錯誤 • 邏輯錯誤 • 特定的應用程式例外 • 系統錯誤
15.2 try-catch敘述與Java例外處理機制 範例:傳統的應用程式的例外處理 9個元素,最大索引值等於8 索引值大於8則離開迴圈,避免錯誤 4個元素,最大索引值等於3 索引值大於3則離開迴圈
15.2 try-catch敘述與Java例外處理機制 傳統程式錯誤處理的問題 • 缺乏一致性,難以維護。 • 每一個錯誤必須有其專屬的處理版本。 • 難以處理隱藏性的錯誤。
15.2 try-catch敘述與Java例外處理機制 try-catch 語法 監控區塊 try{ // 可能發生錯誤的程式區塊 … }catch(Exception e){ //例外類別 // 處理錯誤的程式碼區塊 } 錯誤處理區塊
15.2 try-catch敘述與Java例外處理機制 try-catch 程式執行流程
15.2 try-catch敘述與Java例外處理機制 範例:try-catch 示範 6個元素 最大索引值等於5 指定索引值6 發生錯誤 跳至catch區塊 135 程式錯誤訊息: java.lang.ArrayIndexOutOfBoundsException: 6
15.2 try-catch敘述與Java例外處理機制 try-catch 好處 • 讓所有的錯誤處理程式能夠有一致的處理方式。 • 不需預先針對各種錯誤撰寫特定的錯誤處理邏輯。 • 監控程式同時會針對各種未知或是隱藏的錯誤,自動處理。
15.2 try-catch敘述與Java例外處理機制 finally 語法 try{ // 可能發生錯誤的程式區塊 … }catch(Exception e){ //例外類別 // 處理錯誤的程式碼區塊 }finally{ // 例外處理終止 } try-catch 終止程序
7.3 二維陣列 finally 程式流程
15.2 try-catch敘述與Java例外處理機制 範例:finally示範 1 取得元素 例外監控結束 應用程式結束
15.2 try-catch敘述與Java例外處理機制 範例:finally示範(進入catch) String[] strArray = {"x","2","3","4","5","6"}; 索引值 0 的第一個元素是「x」,轉換成為Integer 發生錯誤 程式錯誤訊息 java.lang.NumberFormatException: For input string: "x“ 例外監控結束 應用程式結束
15.2 try-catch敘述與Java例外處理機制 範例:finally示範(從 catch 跳開) x 程式錯誤訊息 java.lang.NumberFormatException: For input string: "x“ 例外監控結束 return
15.3 例外類別 例外處理類別 封裝錯誤資訊的Exception型態例外物件 ex
15.3 例外類別 Exception 類別方法
7.3 例外類別 範例:應用程式的例外 發生錯誤 直接跳至catch區塊 詳細訊息:java.lang.NumberFormatException: For input string: "X" 簡要訊息:For input string: "X" 以下為錯誤路徑堆疊: java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 錯誤方法:forInputString 錯誤行號:48 …
15.3 例外類別 Throwable 與子類別 • Error • 表示應用程式所可能發生的各種嚴重錯誤,開發人員必須嘗試去排除這些狀況,避免它們在應用程式執行的過程中發生。 • Exception • 子類別有兩種:執行期錯誤與編譯時期錯誤資訊。 > 執行期錯誤在應用程式執行的過程中發生,catch專門捕捉這一類的例外物件。 > 編譯時期錯誤無法通過編譯,很容易被修正,通常不會造成應用程式的問題。
15.3 例外類別 衍生自RuntimeException類別的例外類別
15.3 例外類別 範例:精確的捕捉例外 捕捉數字格式轉換的錯誤NumberFormatException 「x」轉換成為數字發生錯誤 數字格式的轉換錯誤,請指定數值
15.4 多重 catch 多重 catch 語法 Try{ // 例外監控區塊 … }catch(Exceptionx nfex){ … }catch(Exceptiony aifex){ … }catch(Exception ex){ … } 多重catch捕捉不同的例外物件
15.4 多重 catch 範例:多重 catch charArray[3] 取得「x」 發生轉換失敗 捕捉數字格式錯誤 數字格式的轉換錯誤,請指定數值
15.4 多重 catch 範例:多重 catch – 除以 0 的錯誤 修正為 3 以排除錯誤 除以0的錯誤 無符合例外物件,由Exception捕捉 java.lang.ArithmeticException: / by zero
15.5 設計自己的例外處理系統 throw 關鍵字與擲出例外物件 throw 關鍵字用來強制擲出例外物件 throw myExceptionObject 擲出的例外物件
15.5 設計自己的例外處理系統 範例:throw 程式化擲出例外示範 建立 ArithmeticExceptionm例外物件 擲出例外物件 執出例外… 程式執出的 ArithmeticException 例外
15.5 設計自己的例外處理系統 throws 與強制例外捕捉 Public returnTypeName someMethod(…) throws Exception{ … } 程式執行過程中,可能擲出例外,必須利用 try-catch 監控此方法
15.5 設計自己的例外處理系統 範例:throws 強制例外捕捉(1/2) 擲出例外物件 除了7與12,其它的數字均不符合 發生其它錯誤如下: For input string: "a"
15.5 設計自己的例外處理系統 範例:throws 強制例外捕捉(2/2) must be caught or declared to be thrown
15.5 設計自己的例外處理系統 範例:不規則二維陣列 建立自訂例外類別CEx物件 擲出例外類別物件 自訂繼承 Exception 的例外類別CEx 執出自訂例外物件錯誤訊息 null
15.5 設計自己的例外處理系統 範例:運用自訂例外類別(1/3)
15.5 設計自己的例外處理系統 範例:運用自訂例外類別(2/3) throws宣告擲出例外物件 擲出自訂例外類別 物件 繼承Exception自訂例外類別 傳入自訂錯誤訊息
15.5 設計自己的例外處理系統 範例:運用自訂例外類別(3/3) try-catch 捕捉 DivEx 例外物件 呼叫 DoDiv 偶數除法的錯誤:除數與不可為零