《例外处理》PPT课件.ppt
《《例外处理》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《例外处理》PPT课件.ppt(143页珍藏版)》请在三一办公上搜索。
1、1,第 14 章,例外處理,2,本章提要,14-1 甚麼是例外?14-2 try/catch/finally 敘述14-3 抛出例外14-4 自訂例外類別14-5 綜合演練,3,前言,在整個程式的生命週期中,難免會發生一些問題或錯誤,大概可分為以下幾類:編譯時期錯誤:這是在程式開發過程中所發生的,例如初學者最常遇到的語法錯誤就屬於其中一。像是寫程式時忘了在敘述後面加分號、變數名稱打錯等等,如此一來在編譯程式時就無法編譯成功,因此稱之為編譯時期錯誤(compiler-time error)。,4,前言,邏輯錯誤:這種錯誤是指程式雖能編譯成功、也能正常執行,但執行的結果卻不是我們所預期的。換言之是
2、程式的邏輯有問題所產生的錯誤,例如您要寫一個程式計算球體體積,但將計算公式轉成程式的形式時,不小心打錯了,導致計算結果不正確,這就是一種邏輯錯誤。,5,前言,執行時期錯誤:此錯誤也是在程式編譯成功後,於執行階段發生的錯誤,但執行時期錯誤(run-time error)是指程式本身邏輯沒有問題,但在執行時發生當初設計程式時,未預期的狀況,導致程式無法正常執行的情形。舉例來說,如果程式中有除法運算,但用來當除數的整數變數其值為 0(可能是使用者輸入錯誤),就會使程式發生除以 0 的錯誤。,6,前言,本章要介紹的例外處理,就是要處理執行時期錯誤,讓我們的程式即使遇到突發狀況時,也能執行完成。,7,1
3、4-1 甚麼是例外?,簡單的說,程式執行時期,所發生的不可預期錯誤就可稱為例外(Exception)。發生例外時,Java 程式將會不正常中止,輕則讓使用者覺得程式有問題、重則導致使用者的資料毀損/喪失。為了讓 Java 程式設計人員能設計出安全可靠(robust)的程式,不會因例外發生,程式就什麼事都不能做,因此 Java 語言特別內建了例外處理的功能。,8,有狀況:引發例外,在第二章曾介紹過,Java 程式是在 Java 虛擬機器(JVM)中執行的。在預設的情況下,當程式執行時發生例外,JVM 就會攔截此例外狀況,並拋出(throw)此例外事件。,9,例外案例之一:使用者輸入錯誤,使用者輸
4、入非程式預期資料,而導致例外,是典型的例外案例。在前幾章我們都有使用到由鍵盤取得使用者輸入的範例程式,而只要我們故意輸入非程式所需的資料,就會發生例外。例如下面這個第 6 章的畫三角形範例:,10,例外案例之一:使用者輸入錯誤,11,例外案例之一:使用者輸入錯誤,12,例外案例之一:使用者輸入錯誤,13,例外案例之一:使用者輸入錯誤,由於第 13 行呼叫的 Integer.parseInt()方法只能解讀以數字構成的字串,而我們故意輸入文字或是有小數點的數字,就會導致程式無法解讀,而引發例外(另一種說法是:拋出例外)。此時 Java 會顯示一連串例外的相關訊息,並中止程式執行(另一說法是執行緒
5、被終止,關於執行緒請見下一章),因此第 15 行以下的程式也不會執行到。,14,例外案例之一:使用者輸入錯誤,在例外訊息中,可看到例外所屬的 例外類別:,15,例外案例之二:程式設計不當,另一種可能引發例外的情況是程式設計不當,例如在第 8 章介紹陣列時提過,當程式中使用的元素索引碼超出陣列範圍,就會產生例外:,16,例外案例之二:程式設計不當,17,例外案例之二:程式設計不當,從執行結果我們可以看到,當程式執行到 i 的值等於 4 的時候,由於 4 已超出陣列元素的索引範圍,所以執行到第 8 行程式時,存取 ai(相當於 a4)的動作就會引發例外。,18,例外案例之二:程式設計不當,同樣的,
6、這個範例也是在 Java 輸出一長串的訊息後,程式就停止執行了,因此第 10 行的敘述也不會被執行到。這個範例所引發的例外,所屬的類別和前一個例子也不同:,19,Java 程式處理例外狀況的方式,例外處理流程例外類別,20,例外處理流程,當程式執行時發生了例外,Java 會拋出(throw)例外,也就是將例外的相關資訊包裝在一個例外物件之中,然後丟給目前執行的方法來處理,此時會有兩種狀況:如果方法中沒有處理這個例外的程式碼,則轉向呼叫者(呼叫該方法的上一層方法)尋找有無處理此例外的程式碼。若一直找到最上層的 main()都沒有處理這個例外的程式碼發生時,該程式將會停止執行。,21,例外處理流程
7、,若程式中有處理這個例外的程式碼,則程式流程會跳到該處繼續執行(詳細流程請參見下一節說明)。以前面陣列索引碼超出範圍的例子而言,該例外是在 main()方法中拋出的,所以 Java 會看 main()中是否有處理該例外的處理程式,以便將例外物件拋給它處理。,22,例外處理流程,不過在我們的範例程式中當然是沒有任何例外處理程式,而 main()又是最上層的方法(畢竟程式是由它開始執行的),所以這個例外只好由 Java 自己來處理,而它的處理方式很簡單,就是印出一段有關該例外的訊息,並終止程式的執行,由前面的執行結果即可印證。,23,例外處理流程,如果希望例外發生時,程式不會莫名其妙的停止執行,就
8、必須加入適當的例外處理程式。以陣列索引碼超出範圍為例,我們必需在 main()方法中撰寫處理相關的例外物件,此物件所屬的類別就是出現在錯誤訊息中的 ArrayIndex OutOfBoundsException。,24,例外處理流程,而處理這類例外的相關程式碼,在 Java 中通常稱之為 捕捉(catch)ArrayIndexOutOfBoundsException 例外的程式。,25,例外類別,在 Java 中,所有拋出的例外都是以 Throwable 類別及其衍生類別所建立的物件來表示,像 NumberFormatException、ArrayIndexOutOfBoundsExcepti
9、on 都是其衍生類別。Throwable 類別有兩個子類別:Error 和Exception 分別代表兩大類的 Java 例外,而這兩個類別之下又各有許多子類別和衍生類別,分別代表不同類型的例外。,26,例外類別,Error 類別:此類別及其衍生類別代表的是嚴重的錯誤,例如系統資源不足,導致程式無法執行、或是 JVM 本身發生錯誤。由於此類錯誤通常也是我們無法處理的,所以一般我們不會在程式中捕捉此類的例外物件。,27,例外類別,Exception 類別:此類別及其衍生類別就是代表一般的例外,也是一般撰寫錯誤處理程式所會捕捉的類別。Exception 類別之下則有多個子類別,但在本章中我們將重點
10、放在 RuntimeException 這個子類別。,28,例外類別,29,例外類別,顧名思義,RuntimeException 類別代表的就是執行時的例外。此類別下有多個子類別和衍生類別分別代表不同類型的執行時期例外。例如前面提過的,在程式中指定超過範圍的索引碼時,就會引發 ArrayIndexOut OfBoundsException 類別的例外。此類別是 RuntimeException的孫類別,其父類別是 IndexOutOfBoundsException。,30,例外類別,另一種我們有時會遇到的例外,則是RuntimeException 的另一個子類別 ArithmeticExcep
11、tion 的例外物件,當程式中做數學運算時發生錯誤情況(例如前面提過的除以 0),就會引發這個例外。接下來我們就來看要如何用 Java 程式捕捉這類例外。,31,14-2 try/catch/finally 敘述,在 Java 程式中撰寫例外處理程式,可使用 try、catch、finally 三個敘述。但以最簡單的捕捉例外程式,只需用到 try 和 catch 敘述即可。,32,捕捉例外狀況,try 和 catch 敘述的意思很簡單,當我們要執行一段有可能引發例外的程式,我們就將它放在 try 區塊中,同時用 catch 敘述來捕捉可能被拋出的例外物件,並撰寫相關的處理程式。其結構如下:,3
12、3,捕捉例外狀況,34,捕捉例外狀況,try 是嘗試的意思,所以上列的結構就像是嘗試執行一段可能引發例外的敘述,如果的則發生例外時,就由捕捉(catch)該例外的區塊來處理。,35,捕捉例外狀況,36,捕捉例外狀況,舉個最簡單的例子,若要捕捉之前所提的 ArrayIndexOutOfBoundsException 例外,可用如下範例的 try/catch 段落來處理:,37,捕捉例外狀況,38,捕捉例外狀況,39,捕捉例外狀況,第 717 行就是整個 try/catch 區塊。第 711 行的 try 區塊,就是單純用迴圈輸出所有的陣列元素。當迴圈變數 i 的值為 4 時,執行第 10 行程式
13、就會引發例外。第 1117 行就是捕捉超出陣列範圍例外的 catch 區塊。第 15 行程式直接輸出例外物件 e 的內容。,40,捕捉例外狀況,不管有沒有發生 ArrayIndexOutOfBoundsException 例外,都會執行到第 19 行的程式。如果是在撰寫商用程式,隨便顯示一行例外訊息,對使用者來說並不友善,因為使用者可能根本不懂 Java 程式語言,根本不瞭解什麼是例外;或是不能完全明白為什麼發生錯誤。,41,捕捉例外狀況,此時若能讓程式顯示更多的相關資訊,可幫助使用者瞭解問題所在,例如需要使用者輸入資料的應用程式,能回應使用者可能因為輸入什麼樣的錯誤資料,導致程式發生問題更好
14、。以下就是在 catch 區塊中顯示與例外相關訊息的範例。,42,捕捉例外狀況,43,捕捉例外狀況,44,捕捉例外狀況,45,捕捉例外狀況,這個範例程式內建一個整數陣列,並請使用者自行選擇要看陣列中的哪一個數字。如果使用者指定的數字超出範圍,就會引發 ArrayIndexOutOf BoundsException 的例外,在 catch 區塊中,會顯示這個程式只有 5 個數字,並告知使用者指定的數字超出範圍。,46,捕捉多個例外,如果程式中雖有 try/catch 敘述捕捉特定的例外,但在執行時發生了我們未捕捉的例外,會發生什麼樣的狀況呢?很簡單,就和我們沒寫任何 try/catch 敘述一樣
15、,Java 會找不到處理這個例外的程式,因此程式會直接結束執行。我們直接用剛剛的 CatchAndShowInfo.java 來示範:,47,捕捉多個例外,48,捕捉多個例外,如以上執行結果所示,雖然程式中有捕捉 ArrayIndexOutOfBoundsException,但只要使用者輸入整數以外的內容,就會使 Integer.parseInt()方法因無法解譯而拋出 NumberFormatException 例外,由於程式未捕捉此例外,因而導致程式意外結束。,49,捕捉多個例外,要用 try/catch 敘述來解決這個問題,我們可讓程式再多捕捉一個 ArithmeticException
16、 例外,也就是讓程式有兩個 catch 段落。寫法很簡單,只要讓 2 個 catch 段落接連列在 try 區塊之後即可。例如:,50,捕捉多個例外,51,捕捉多個例外,請參考以下的範例程式:,52,捕捉多個例外,53,捕捉多個例外,54,捕捉多個例外,第 18 行將呼叫 Integer.parseInt()方法的敘述移到 try 區塊中,以便程式能捕捉此方法可能拋出的例外。第 26 捕捉 NumberFormatException 例外,並在第 27 行顯示錯誤訊息。,55,捕捉多個例外,雖然我們可以用多個 catch 敘述來捕捉不同類型的例外,但若可能發生的例外種類較多,那要加好幾個 ca
17、tch 敘述也有些麻煩,而且也難保不會有所遺漏。在此情況下,可考慮捕捉上層的例外類別。在介紹此方法前,我們再來對 Java 的例外處理機制做更進一步的認識。,56,自成體系的例外類別,Throwable 類別Exception 類別捕捉上層的例外,57,Throwable 類別,如前所述,Java 所有的例外都是以 Throwable 類別及其衍生類別所建立的物件。Throwable 類別本身已定義了數個方法,這些方法也自然由其衍生類別所繼承,所以我們在處理所有例外時,也可叫用這些方法。不過這些方法中,有些是用於自訂例外類別、部份則是進階的程式除錯才會用到,我們就不深入探討。另外 Throwa
18、ble 類別也定義了兩個可傳回例外相關資訊的方法:,58,Throwable 類別,上述 2 個方法的用法,可參考以下的範例程式:,59,Throwable 類別,60,Throwable 類別,61,Throwable 類別,62,Throwable 類別,Throwable 只有 Error 和 Exception 兩個子類別,其中 Error 類別代表系統的嚴重錯誤,通常不需由程式處理,也就是說我們不需撰寫捕捉此類敘述的 catch 敘述。而 Exception 類別下則有許多衍生類別分別代表一般寫程式時可能遇到的例外,因此以下我們進一步介紹 Exception 類別及其衍生類別。,63
19、,Exception 類別,Exception 類別之下的子類別種類相當多,而各子類別下又有或多或少的不同子類別。除了 RuntimeException 外,Exception 的子類別都是呼叫 Java 標準類別庫中特定的方法,或是在我們程式要自己拋出類別時才會用到,初學者大都只會用到 RuntimeException 這個子類別下的某幾個類別。,64,Exception 類別,除了我們已用過的 ArrayIndexOutOfBoundsException 和 ArithmeticException 外,我們再介紹幾個 RuntimeException 下的子類別和孫類別。,65,Excep
20、tion 類別,NullPointerException:當程式需使用一個指向物件的參照,但該參照卻是 null 時就會引發此例外。例如程式需要參考一個物件,但我們提供的物件參照卻是 null,Java 就會拋出 NullPointerException 例外的物件。NegativeArraySizeException:陣列大小為負數時,就會引發此例外。,66,Exception 類別,NumberFormatException:當程式要將某個字串轉換成數值格式,但該字串的內容並不符該數值格式的要求,就會引發此例外。在前面的範例已看過,呼叫 Integer.parseInt()方法要將字串轉成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 例外处理 例外 处理 PPT 课件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5627921.html