第8章 Java異常處理_第1頁
第8章 Java異常處理_第2頁
第8章 Java異常處理_第3頁
第8章 Java異常處理_第4頁
第8章 Java異常處理_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Java語言與系統(tǒng)設(shè)計中南大學信息科學與工程學院中南大學信息科學與工程學院計算機工程系計算機工程系 黃家瑋黃家瑋 第第8章章 Java異常處理異常處理o異常的概念異常的概念o異常的捕獲異常的捕獲o異常的拋出異常的拋出o自定義異常自定義異常異常的概念異常的概念o最簡單的例子為例:編寫一個程序,能最簡單的例子為例:編寫一個程序,能夠讓用戶輸入一個圓的半徑,然后打印夠讓用戶輸入一個圓的半徑,然后打印這個圓的面積。這個圓的面積。實例實例1package exception; import javax.swing.JOptionPane; public class Calc1 public static

2、 void main(String args) /半徑輸入框,返回字符串半徑輸入框,返回字符串String str = JOptionPane.showInputDialog(null,請您輸入半徑請您輸入半徑); /*轉(zhuǎn)換成轉(zhuǎn)換成double*/ double r = Double.parseDouble(str); /計算計算 double area = Math.PI * r * r; /*打印結(jié)果打印結(jié)果*/ System.out.println(該圓面積是:該圓面積是: + area); System.out.println(程序運行完畢程序運行完畢); o正常輸入正常輸入“10”o

3、異常異常(Exception)又稱為例外,在程序執(zhí)行又稱為例外,在程序執(zhí)行的過程中,任何中斷正常程序流程的現(xiàn)象的過程中,任何中斷正常程序流程的現(xiàn)象或事件都是異?;蝈e誤。為了能夠及時有或事件都是異?;蝈e誤。為了能夠及時有效地處理程序中的運行錯誤,效地處理程序中的運行錯誤,Java語言中語言中引入了異常和異常類。引入了異常和異常類。o作為面向?qū)ο蟮恼Z言,異常與其他語言要素作為面向?qū)ο蟮恼Z言,異常與其他語言要素一樣,是特殊的運行錯誤對象,對應(yīng)著一樣,是特殊的運行錯誤對象,對應(yīng)著Java語言特定的運行錯誤處理機制。語言特定的運行錯誤處理機制。o例如:在做除法時除數(shù)為例如:在做除法時除數(shù)為0、數(shù)據(jù)超過預

4、定、數(shù)據(jù)超過預定范圍、打開文件時該文件不存在、網(wǎng)絡(luò)連接范圍、打開文件時該文件不存在、網(wǎng)絡(luò)連接時突然中斷等情況發(fā)生時都會出現(xiàn)異常。時突然中斷等情況發(fā)生時都會出現(xiàn)異常。異常通常分為三類:異常通常分為三類:o(1) 程序可控制的異常程序可控制的異常o這類異??梢员幌到y(tǒng)發(fā)現(xiàn),并通過程序可以被處理和控制。這類異常可以被系統(tǒng)發(fā)現(xiàn),并通過程序可以被處理和控制。一般是可預見的錯誤,不是致命的。例如:除數(shù)為零,數(shù)一般是可預見的錯誤,不是致命的。例如:除數(shù)為零,數(shù)組下標越界。組下標越界。o(2) 程序不可控制的異常程序不可控制的異常o這類異常往往是致命的,但是系統(tǒng)可以預見的,出現(xiàn)這種這類異常往往是致命的,但是系統(tǒng)

5、可以預見的,出現(xiàn)這種異常程序必須被終止。一般由異常程序必須被終止。一般由JVM來處理。如系統(tǒng)棧溢出。來處理。如系統(tǒng)棧溢出。o(3) 人為異常:人為異常:o利用異常處理機制,制造異常、處理異常。如:要求輸入利用異常處理機制,制造異常、處理異常。如:要求輸入字母,而輸入了數(shù)字等。字母,而輸入了數(shù)字等。o異常的出現(xiàn),是在程序編譯通過的情況下,程序運行過異常的出現(xiàn),是在程序編譯通過的情況下,程序運行過程中出現(xiàn)一些突發(fā)情況造成的。程中出現(xiàn)一些突發(fā)情況造成的。o如果任由異常出現(xiàn)不去管它,會給軟件帶來什么樣的問如果任由異常出現(xiàn)不去管它,會給軟件帶來什么樣的問題呢?題呢? 很顯然,首先是沒有給用戶一個較為友好

6、的界很顯然,首先是沒有給用戶一個較為友好的界面,比如用戶不小心將面,比如用戶不小心將“10”輸成了輸成了“1o”,至少正確的,至少正確的軟件應(yīng)該提示用戶軟件應(yīng)該提示用戶“格式輸錯了格式輸錯了”,讓他重新輸入。否,讓他重新輸入。否則用戶看到一堆亂糟糟的東西,你要他怎么處理?則用戶看到一堆亂糟糟的東西,你要他怎么處理? o而且,可能還沒有意識到的問題是:異常不處理,會給而且,可能還沒有意識到的問題是:異常不處理,會給程序帶來安全隱患。程序帶來安全隱患。o如果是一個比較復雜的程序,要經(jīng)歷:打開文件、如果是一個比較復雜的程序,要經(jīng)歷:打開文件、讀寫文件、關(guān)閉文件操作,流程如下:讀寫文件、關(guān)閉文件操作,

7、流程如下:1:打開文件連接打開文件連接 2:讀文件讀文件 3:將文件中的字符串轉(zhuǎn)為數(shù)值將文件中的字符串轉(zhuǎn)為數(shù)值 4:關(guān)閉文件關(guān)閉文件o如果在第如果在第3步出現(xiàn)異常,則該文件的關(guān)閉不被執(zhí)行,步出現(xiàn)異常,則該文件的關(guān)閉不被執(zhí)行,這樣文件就一直處于打開狀態(tài),無法被其他程序使這樣文件就一直處于打開狀態(tài),無法被其他程序使用。用。o1. 異常類型為:異常類型為:java.lang.NumberFormatException??梢?。可以查看文檔,找到該類,在文檔中非常詳細地說明了該異常查看文檔,找到該類,在文檔中非常詳細地說明了該異常出現(xiàn)的原因:出現(xiàn)的原因: 翻譯成中文是:當你將一個不是數(shù)值格式的字符串轉(zhuǎn)成

8、數(shù)翻譯成中文是:當你將一個不是數(shù)值格式的字符串轉(zhuǎn)成數(shù)值時,出現(xiàn)該異常。值時,出現(xiàn)該異常。 o2異常的消息:顯示了不能轉(zhuǎn)成數(shù)值的內(nèi)容是:異常的消息:顯示了不能轉(zhuǎn)成數(shù)值的內(nèi)容是:“1o”。 o3. 異常出現(xiàn)的地點:顯示了異常出現(xiàn)的地點:顯示了3行信息。特別是最后一行顯示行信息。特別是最后一行顯示了在了在Calc1.java的第的第8行發(fā)生了異常。行發(fā)生了異常。o在在Calc1中中8行,調(diào)用了行,調(diào)用了Double.parseDouble(str)函數(shù),將函數(shù),將str,也就是,也就是“1o”傳給了傳給了parseDouble函數(shù),該函數(shù)在底函數(shù),該函數(shù)在底層又調(diào)用了其他函數(shù),實際上異常是在最底層產(chǎn)

9、生的。層又調(diào)用了其他函數(shù),實際上異常是在最底層產(chǎn)生的。 o在這里可以看出,異常首先在在這里可以看出,異常首先在sun.misc.FloatingDecimal.readJavaFormatString中產(chǎn)生,中產(chǎn)生,然后傳給然后傳給java.lang.Double.parseDouble,最后傳給,最后傳給exception.Calc1.main。 o因此,當系統(tǒng)底層出現(xiàn)異常時,實際上是將異常用一個因此,當系統(tǒng)底層出現(xiàn)異常時,實際上是將異常用一個對象包裝起來,傳給調(diào)用方對象包裝起來,傳給調(diào)用方(客戶端客戶端),俗稱,俗稱拋出拋出(throw)。o常見異常常見異常o異常類一般都是異常類一般都是E

10、xception的子類,類名以的子類,類名以Exception結(jié)結(jié)尾。在尾。在JDK的每一個包中都幾乎定義有一些異常,在以的每一個包中都幾乎定義有一些異常,在以后的學習以及開發(fā)中,如果程序出錯,建議通過提示信后的學習以及開發(fā)中,如果程序出錯,建議通過提示信息,在文檔中找其原因。息,在文檔中找其原因。 o比如,比如,NullPointerException是一種比較常見的異常,是一種比較常見的異常,叫做叫做“未分配內(nèi)存異常未分配內(nèi)存異?!保ǔR粋€對象需要用,通常一個對象需要用new來來分配內(nèi)存,如果沒有分配內(nèi)存的情況下就訪問它,就會分配內(nèi)存,如果沒有分配內(nèi)存的情況下就訪問它,就會拋出這種異常。

11、拋出這種異常。package exception; public class NullPointerTest1 private static int arr; public static void main(String args) arr0 = 10; oJava語言中定義了很多異常類,每個異常類都代表了一種語言中定義了很多異常類,每個異常類都代表了一種運行錯誤,類中包含了該運行錯誤的信息和處理錯誤的方運行錯誤,類中包含了該運行錯誤的信息和處理錯誤的方法等內(nèi)容。法等內(nèi)容。o每當每當Java程序運行過程中發(fā)生一個可識別的運行錯誤時,程序運行過程中發(fā)生一個可識別的運行錯誤時,就有一個異常類與該錯

12、誤相對應(yīng),并且系統(tǒng)都會產(chǎn)生一個就有一個異常類與該錯誤相對應(yīng),并且系統(tǒng)都會產(chǎn)生一個相應(yīng)的該異常類的對象,即產(chǎn)生一個異常。相應(yīng)的該異常類的對象,即產(chǎn)生一個異常。o一旦一個異常對象產(chǎn)生了,系統(tǒng)中就一定有相應(yīng)的機制來一旦一個異常對象產(chǎn)生了,系統(tǒng)中就一定有相應(yīng)的機制來處理它,確保不會產(chǎn)生死機、死循環(huán)或其他對操作系統(tǒng)的處理它,確保不會產(chǎn)生死機、死循環(huán)或其他對操作系統(tǒng)的損害,從而保證了整個程序運行的安全性。這就是損害,從而保證了整個程序運行的安全性。這就是Java的的異常處理機制。異常處理機制。oThrowable類是類庫類是類庫java.lang包中的一個類,該類不能直包中的一個類,該類不能直接使用。它派

13、生了兩個子類:接使用。它派生了兩個子類:Exception和和Error。其中。其中Error類表示恢復不是不可能但很困難的一種嚴重錯誤,類表示恢復不是不可能但很困難的一種嚴重錯誤,其由系統(tǒng)保留,而其由系統(tǒng)保留,而Exception類則供應(yīng)用程序使用。同其類則供應(yīng)用程序使用。同其他的類一樣,他的類一樣,Exception類也有自己的方法和屬性。類也有自己的方法和屬性。 oJava語言中,每一種異常類都對應(yīng)一種特定的運行錯誤。語言中,每一種異常類都對應(yīng)一種特定的運行錯誤。所有的所有的Java異常類都是系統(tǒng)類庫中的異常類都是系統(tǒng)類庫中的Exception類的子類。類的子類。 oException類

14、有若干子類,每一個子類代表了一種類有若干子類,每一個子類代表了一種特定的運行時錯誤。特定的運行時錯誤。o這些子類有些是系統(tǒng)事先定義好并包含在這些子類有些是系統(tǒng)事先定義好并包含在Java類庫類庫中的,稱為系統(tǒng)定義的運行異常。中的,稱為系統(tǒng)定義的運行異常。o系統(tǒng)定義的運行異常通常對應(yīng)著系統(tǒng)運行錯誤。由系統(tǒng)定義的運行異常通常對應(yīng)著系統(tǒng)運行錯誤。由于這些錯誤可能導致操作系統(tǒng)錯誤甚至是整個系統(tǒng)于這些錯誤可能導致操作系統(tǒng)錯誤甚至是整個系統(tǒng)的癱瘓,所以需要定義異常類來特別處理。的癱瘓,所以需要定義異常類來特別處理。2. 異常的捕獲異常的捕獲o在編程時,事先準備一段代碼,當程序發(fā)生在編程時,事先準備一段代碼,

15、當程序發(fā)生異常時,執(zhí)行那段處理異常的代碼,如果沒異常時,執(zhí)行那段處理異常的代碼,如果沒有異常,那段代碼也得備用在那邊。有異常,那段代碼也得備用在那邊。 o這就是異常的這就是異常的就地捕獲就地捕獲(catch):當程序發(fā)生:當程序發(fā)生異常時,系統(tǒng)捕獲異常,轉(zhuǎn)而執(zhí)行異常處理異常時,系統(tǒng)捕獲異常,轉(zhuǎn)而執(zhí)行異常處理代碼。代碼。過程如下:過程如下: o第第1步:用步:用try塊將可能出現(xiàn)異常的代碼包起來。塊將可能出現(xiàn)異常的代碼包起來。 o第第2步:用步:用catch塊來捕獲異常并處理異常。塊來捕獲異常并處理異常。 o第第3步:如果有一些代碼是不管異常是否出現(xiàn)步:如果有一些代碼是不管異常是否出現(xiàn)都要運行的

16、,用都要運行的,用finally塊將其包起來。塊將其包起來。 try /*可能出現(xiàn)異常的代碼*/ catch(Exception1 ex1) /*處理異常*/ finally /*不管異常是否出現(xiàn)都要運行的代碼*/ try 代碼代碼1 代碼代碼2出現(xiàn)異常,后面的代碼出現(xiàn)異常,后面的代碼3將不被運行,運行代碼將不被運行,運行代碼4 代碼代碼3 catch(Exception1 ex1) 代碼代碼4. 運行之后,運行代碼運行之后,運行代碼5 finally 代碼代碼5. 運行之后,運行代碼運行之后,運行代碼6 代碼代碼6try 1:打開文件連接打開文件連接 2:讀文件讀文件 3:將文件中的字符串轉(zhuǎn)

17、為數(shù)值將文件中的字符串轉(zhuǎn)為數(shù)值 catch(Exception1 ex1) /*處理異常處理異常*/ finally 4:關(guān)閉文件關(guān)閉文件 3. 捕獲多種異常捕獲多種異常o由于系統(tǒng)的復雜性,此時我們能夠預由于系統(tǒng)的復雜性,此時我們能夠預見的異常有文件型異常和字符串轉(zhuǎn)換見的異常有文件型異常和字符串轉(zhuǎn)換的異常,但是還可能有無法預見的異的異常,但是還可能有無法預見的異常,怎樣將異常常,怎樣將異?!耙痪W(wǎng)打盡一網(wǎng)打盡”呢?呢? 可可以加入一個以加入一個catch塊來處理其他不可預塊來處理其他不可預見的異常。見的異常。實例實例2-捕獲異常捕獲異常 4. Finally保證安全性保證安全性 實例實例3-1實

18、例實例3-2Finally是否可有可無?是否可有可無? o不是的,不是的,finally最大的特點就是:最大的特點就是:在在try塊內(nèi)即使跳出了代碼塊,甚塊內(nèi)即使跳出了代碼塊,甚至跳出函數(shù),至跳出函數(shù),finally內(nèi)的代碼仍然內(nèi)的代碼仍然能夠運行。能夠運行。實例實例4-1實例實例4-25. 向前拋出異常向前拋出異常o復雜的軟件可能由很多模塊構(gòu)成,模復雜的軟件可能由很多模塊構(gòu)成,模塊之間存在著復雜的調(diào)用關(guān)系,當某塊之間存在著復雜的調(diào)用關(guān)系,當某個模塊發(fā)生異常時,可以不在模塊內(nèi)個模塊發(fā)生異常時,可以不在模塊內(nèi)處理異常,而將異常拋給這個模塊的處理異常,而將異常拋給這個模塊的調(diào)用方。調(diào)用方。opub

19、lic void fun() throws NullPointerException o/該函數(shù)如出現(xiàn)NullPointerException,則向前拋出 o 實例實例5- 就地處理就地處理實例實例6-向前拋出向前拋出6. 自定義異常自定義異常package exception; import java.util.Date; import javax.swing.JOptionPane; public class Calc9 /該函數(shù)中如果出現(xiàn)異常,向前拋出 public static void calcArea() throws Exception String str = JOptionP

20、ane.showInputDialog(null, 請您輸入半徑); double r = Double.parseDouble(str); double area = Math.PI * r * r; System.out.println(該圓面積是: + area); public static void main(String args) try calcArea(); catch(Exception ex) /處理異常 System.out.println(發(fā)生了異常);System.out.println(時間為: + new Date(); o但是從專業(yè)角度,我們更加希望異常消息和

21、異常時間可但是從專業(yè)角度,我們更加希望異常消息和異常時間可以封裝在一個新的異常對象里面。如果那樣,就相當于以封裝在一個新的異常對象里面。如果那樣,就相當于給予異常更加豐富的功能,如果以后用戶又要在異常出給予異常更加豐富的功能,如果以后用戶又要在異常出現(xiàn)的時候保存其他內(nèi)容,就直接封裝在異常內(nèi)部?,F(xiàn)的時候保存其他內(nèi)容,就直接封裝在異常內(nèi)部。osuper(message);是初始化父類構(gòu)造函數(shù)。是初始化父類構(gòu)造函數(shù)。2在可能發(fā)生異常的函數(shù)后面添加throws XXXException。 如calcArea函數(shù)就可以改為: public static void calcArea() throws In

22、putException / 4. 在調(diào)用方用try-catch捕捉異常對象。 如下代碼: try calcArea(); catch(InputException ie) System.out.println(ie.getMessage(); System.out.println(時間為: + ie.getDate(); 實例實例10-完整結(jié)構(gòu)完整結(jié)構(gòu)第第8章章 Java異常處理異常處理o異常的概念異常的概念o異常的捕獲異常的捕獲o異常的拋出異常的拋出o自定義異常自定義異常o下面的關(guān)鍵字(下面的關(guān)鍵字( )與異常處理無關(guān)。)與異常處理無關(guān)。 A. switch B. catch C. try D. finallyo請問所有的異常類皆繼承哪一個類?(請問所有的異常類皆繼承哪一個類?( )oAjava.lang.ThrowableoBjava.lang.ExceptionoCjava.lang.Error

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論