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