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

下載本文檔

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

文檔簡介

1、第第1313章章 異常處理異常處理立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 2 立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 3本章知識重點(diǎn)3132異異 常常異常處理機(jī)制異常處理機(jī)制異常類異常類異常的類別異常的類別 捕獲異常捕獲異常拋出異常拋出異常創(chuàng)建自定義異常創(chuàng)建自定義異常異常處理的作用異常處理的作用立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 4 異常類 我們總是試圖避免在軟件程序中錯(cuò)誤的發(fā)生,但是百分之百沒有錯(cuò)誤的程序是不存在的。無論怎樣,如果我們能適當(dāng)?shù)奶幚礤e(cuò)誤,將會極大的改善程序的可讀性、可靠性以及可維護(hù)性。Java編程語言使用異常來處理錯(cuò)誤。這章主要講述在什么時(shí)候和怎樣使

2、用異常來處理錯(cuò)誤立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 5異常處理程序的基本形式異常處理程序的基本形式method() throws ExceptionType2,ExceptionType3,try /程序塊程序塊 catch (ExceptionType1 e) / 對對ExceptionType1的處理的處理 catch (ExceptionType2 e) / 對對ExceptionType2的處理,處理了一部分,的處理,處理了一部分,throw(e); /再拋出這個(gè)再拋出這個(gè)“異常異?!苯o上層的調(diào)用者給上層的調(diào)用者finally 立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì)

3、 6異常對象異常對象每個(gè)異常都是一個(gè)對象,它是Throwable類或其它子類的實(shí)例.當(dāng)一個(gè)方法出現(xiàn)異常后便拋出一個(gè)異常對象,該對象中包含有異常信息,調(diào)用這個(gè)對象的方法可以捕獲到這個(gè)異常并進(jìn)行處理。Throwable類有兩個(gè)標(biāo)準(zhǔn)子類:錯(cuò)誤類:java.lang.Error錯(cuò)誤Error類一般是指虛擬機(jī)相關(guān)的問題,異常類:java.lang.Exception異常Exception類則是指一些可以被捕獲且可能恢復(fù)的異常情況,如數(shù)組下標(biāo)越界 立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 7Java異常類的繼承關(guān)系 Exception異常又分為異常又分為RuntimeException和和non-R

4、untimeException兩大類異常。兩大類異常。立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 8異常實(shí)例設(shè)定一個(gè)名稱為isLegal的變量來檢查數(shù)據(jù)是否合法,如果數(shù)據(jù)大于0時(shí),返回合法值,否則視為不合法,拋出“異?!薄?int isLegal(int dt) throws LowZeroException /這種定義本文中均稱為方法與“異?!蓖ㄟ^throws建立了關(guān)聯(lián)if(dt=0) return data; else throw new LowZeroException(); /*自已寫的異常類,繼承自Exception*/ class LowZeroException extend

5、s Exception public LowZeroException() super(); 立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 9異常的類別在實(shí)際的程序開發(fā)中,異常無處不在,并且種類繁多。區(qū)分什么情況下會出現(xiàn)什么樣的異常是十分必要的。兩個(gè)不同的角度來區(qū)分異常的種類: 異常發(fā)生的原因以 編譯時(shí)對異常的檢查。立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 10異常的類別種類313233Java虛擬機(jī)所檢測到的非正常的執(zhí)行狀態(tài),一般來說這些狀態(tài)在編碼的時(shí)候比較難以檢測,直到運(yùn)行的時(shí)候才會暴露出來。是Java語言中具有throw關(guān)鍵字的語句被執(zhí)行的時(shí)候異步異常立體化教材計(jì)算機(jī)系列 Jav

6、a程序設(shè)計(jì)程序設(shè)計(jì) 11無論是Java的API中定義的諸多異常類還是我們自己定義的異常類(自定義異常在下面本章后面有詳細(xì)的說明),根據(jù)編譯器對異常的檢查情況,又可以分為可檢測異常和不可檢測異常兩種 異常的類別立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 12可檢測異常常見的可檢測異常有:常見的可檢測異常有:ClassNotFoundException;/沒有找到指定類的定義IOException;/指示產(chǎn)生某種輸入/輸出異常。FileNotFoundException;/文件沒有找到異常。ArithmeticException立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 13 異常處理機(jī)制

7、捕獲異常拋出異常創(chuàng)建自定義異常異常處理的作用立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 14捕獲異常Java的異常處理是通過5個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:try、catch、throw、throws和finally和所有的捕獲異常程序一樣,第一步是用try關(guān)鍵字選定監(jiān)控異常的代碼范圍,然后在這段程序之后使用catch關(guān)鍵字捕獲異常,每個(gè)try代碼塊可以使用多個(gè)catch代碼塊來對應(yīng),而catch語句需要指名它所捕獲的異常的類型名。立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 15捕獲異常實(shí)例isLegal方法用來判斷輸入int類型的參數(shù)iData是否合法,如果合法,便將合法的返回參數(shù)賦值給data

8、,如果不合法,則拋出某種異常。 異常拋出后,我們在捕獲模塊(catch)的大括號中打印出錯(cuò)誤int MyMethod(int iData) int data = 0; try int data = isLegal(iData); catch(xException e) System.out.println(發(fā)生數(shù)據(jù)錯(cuò)誤!); return data;立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 16拋出異常 若在try塊中拋出的異常沒有能夠捕獲它的catch塊,或捕獲這個(gè)異常但不想立即處理,則Java將退出這個(gè)方法,并將其返回到上一級處理,如此不斷地遞歸向上直到最外一級。同時(shí),在方法的聲明中

9、要指定方法中可能產(chǎn)生的異常,使這個(gè)方法的調(diào)用者準(zhǔn)備好處理這種異常的代碼,這種類型的異常在此方法的調(diào)用者中得到了處理。調(diào)用者可能自己處理這種異常,也可能將這個(gè)異常放給它的調(diào)用者。異常就這樣逐級上溯,直到找到處理它的代碼為止。如果沒有任何代碼來捕獲并處理這個(gè)異常,Java將結(jié)束這個(gè)程序的執(zhí)行立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 17拋出異常的情況Java可能會拋出異常的情況包括:調(diào)用的方法拋出了異常、檢測到了錯(cuò)誤并使用throw語句拋出異常、程序代碼有錯(cuò)誤,從而導(dǎo)致異常,比如數(shù)組越界錯(cuò)誤、Java運(yùn)行時(shí)刻系統(tǒng)產(chǎn)生內(nèi)部錯(cuò)誤。當(dāng)前兩種異常發(fā)生時(shí),應(yīng)該告訴使用這個(gè)方法的人,此方法強(qiáng)迫Java拋

10、出異常。因?yàn)槿魏螔伋霎惓5姆椒ǘ际菍?dǎo)致程序死亡的陷阱,如果沒有任何代碼來處理方法拋出的異常,就會導(dǎo)致程序結(jié)束立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 18拋出異常步驟確定異常類確定異常類創(chuàng)建異常類的實(shí)例創(chuàng)建異常類的實(shí)例拋出異常拋出異常立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 19拋出異常實(shí)例public class ExceptionUse /可能會拋出異常類的方法public static void throwException() throws Exception System.out.println(下面產(chǎn)生一個(gè)Io異常并將其拋出!); /拋出異常 throw new Run

11、timeException(MyException); public static void main(String args) try throwException(); /捕獲異 catch(Exception re) System.out.println(捕獲Io異常:+re); 立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 20程序的輸出結(jié)果代碼在main()方法中調(diào)用了throwException()方法,此方法的聲明中可以看到,它可能會拋出IoException異常。再看此方法的定義,它使用new運(yùn)算符實(shí)例化了一個(gè)RuntimeException 類,并使用throw語句將其拋出

12、。調(diào)用這個(gè)方法后,異常被拋出,catch語句進(jìn)行捕獲,并打印出異常信息立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 21創(chuàng)建自定義異?,F(xiàn)實(shí)世界是非常復(fù)雜的,常常會有一些特殊的約束要求。例如我們制作一個(gè)統(tǒng)計(jì)河堤水位的軟件,水位過高的時(shí)候,對程序本身只是一個(gè)較大的數(shù)字而已,并不會引發(fā)Java類庫中的異常;但對于現(xiàn)實(shí)中的情況,水位過高就是一個(gè)致命的異常。這種情況下,Java類庫中的異常處理類已經(jīng)不能滿足要求,我們需要拋出一個(gè)新的異常來提示過高的水位:一個(gè)自己定義的異常立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 22自定義語法這里的extends Exception就是我們定義的這個(gè)異常類是從j

13、ava類庫中的Exception這個(gè)類派生的,也就是說,我們自定義的異常類可以擁有Exception這個(gè)類的全部的內(nèi)容,另外,還可以再寫一些我們需要的內(nèi)容在里面創(chuàng)建自己的異常類非常的簡單,可以用下面的聲明語言來定義:class 自定義異常名 xtends Exception立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 23自定義異常實(shí)例一假如我們需要拋出一個(gè)提示水位過高的異常,我們可以寫一個(gè)像下面這樣的異常類class MyException extends Exceptionprivate int i;MyException(int a) i = a; public String toSt

14、ring() return “水位過高”; 立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 24自定義異常實(shí)例二綜合前面幾節(jié)的知識,我們寫一個(gè)拋出這個(gè)異常的程序來測試一下這個(gè)自定義的異常類,同樣的還在這個(gè)類中,建立一個(gè)拋出這個(gè)異常的方法:Static void method(int a) throws MyException/聲明這個(gè)方法會拋出MyException異常If(a 10) throw new MyException(a);/主動拋出MyException(a)立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 25自定義異常實(shí)例三當(dāng)我們調(diào)用類CatchDemo中的靜態(tài)方法method

15、(int a)的時(shí)候,如果我們將大于10 的參數(shù)賦值給method方法的時(shí)候,就會拋出我們上面寫的水位過高的異常。除了需要一個(gè)拋出異常的方法,運(yùn)行這個(gè)方法還需要在main方法中調(diào)用這個(gè)方法:Public static void main(string args) try method(11);Catch(MyExceptin e)System.out.println(e.toSring();立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 26實(shí)例四運(yùn)行上面的程序,在控制臺的輸出界面中,我們可以觀察到下圖的結(jié)果:綜上所述,當(dāng)提供一些特定的功能用Java類時(shí),需要保證類之間有良好的關(guān)系,而且類之間

16、的接口易于理解和實(shí)現(xiàn)。對于異常類一樣,可以定義新的異常類。創(chuàng)建自己的異常類更便于維護(hù)和管理立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 27 異常處理的作用在傳統(tǒng)的非面向?qū)ο蟮木幊陶Z言中,并沒有一個(gè)規(guī)范和穩(wěn)定的錯(cuò)誤處理機(jī)制,編程者必須考慮到在程序中可能出現(xiàn)的各種問題,并且自己定義一種可以表示異常信息的方式最常見的方式就是使用方法返回值進(jìn)行處理。編寫返回一個(gè)執(zhí)行結(jié)果或者狀態(tài)代碼的方法,調(diào)用者根據(jù)返回的執(zhí)行結(jié)果狀態(tài)代碼判斷運(yùn)行結(jié)果的正?;蛘呤×Ⅲw化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 28異常處理的缺點(diǎn)假如狀態(tài)代碼返回一個(gè)錯(cuò)誤的狀態(tài)代碼,則進(jìn)行相應(yīng)的處理,顯示一個(gè)錯(cuò)誤頁面或錯(cuò)誤信息。通過返

17、回值進(jìn)行處理的方法是有效的,但有許多不足之處對于編程人員來說,增加了他們的負(fù)擔(dān)。對于編寫的程序來說,則有以下幾個(gè)缺點(diǎn):出錯(cuò)處理不規(guī)范,降低了程序的可讀性,程序復(fù)雜,可靠性差,返回信息有限, 返回代碼標(biāo)準(zhǔn)化困難立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 29異常處理的優(yōu)點(diǎn)異常處理的方式和傳統(tǒng)的方式有所不同,當(dāng)一個(gè)方法引發(fā)一個(gè)異常之后,可以將異常拋出,由該方法的直接或間接調(diào)用者處理這個(gè)異常。這就是常說的catch-throw(捕獲-拋出)方式采用這種處理方式具有以下幾個(gè)優(yōu)點(diǎn):錯(cuò)誤的處理變得規(guī)范化,把錯(cuò)誤代碼與常規(guī)代碼分開,可以在catch中傳播錯(cuò)誤信息,可以對錯(cuò)誤類型分組,方便定位錯(cuò)誤和維護(hù)立

18、體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 30經(jīng)典練習(xí)題填空題throw語句的作用是 _ 。Exception又分為 _和 _ 異常。Java中,異常分為 _和_兩類。Throwable類有兩個(gè)重要子類:_和_ 。立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 31下面程序段的執(zhí)行結(jié)果是_ 。public class Test public static void main(String args) try return;finallySystem.out.println(Finally);經(jīng)典練習(xí)題立體化教材計(jì)算機(jī)系列 Java程序設(shè)計(jì)程序設(shè)計(jì) 32選擇題異常產(chǎn)生的原因很多,常見的有( )。A.程序設(shè)計(jì)本身的錯(cuò)誤B.程序運(yùn)

溫馨提示

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

評論

0/150

提交評論