版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章異常處理1.異常捕捉與處理什么是異常異常:在程序運(yùn)行過程中,由于硬件設(shè)備出錯、軟件設(shè)計(jì)不完善等原因常常導(dǎo)致出現(xiàn)各種問題,這些問題都會導(dǎo)致程序產(chǎn)生異常事件,如被0除溢出、文件找不到、數(shù)組下標(biāo)越界、指定數(shù)組長度為負(fù)數(shù)等等,發(fā)生這些事件都將阻止程序正常運(yùn)行。在Java中,一個方法在運(yùn)行中出現(xiàn)異常事件時(shí),這個方法將生成一個代表異常的對象,并把它提交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)會找到相應(yīng)的代碼來處理該事件。拋出異常(throw)與捕捉異常(catch)當(dāng)程序運(yùn)行發(fā)生異常時(shí),生成異常對象、并把它提交給運(yùn)行時(shí)系統(tǒng)的過程叫做拋出異常。運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧查找,從生成異常對象的方法進(jìn)行回溯,直到找到相應(yīng)異常處理方法為止,這個過程叫做捕捉異常。開始程序發(fā)生異常實(shí)例化異常對象有try?JVM默認(rèn)異常處理結(jié)束catch1滿足?處理異常1catch2滿足?有finally?處理異常2異常結(jié)束處理YesYesYesYesNoNoNoNo圖7.1Java異常捕捉與處理流程2捕捉異常1拋出異??赡墚a(chǎn)生異常的代碼捕捉異常處理異常3處理異常Java異常的種類Java類庫中,每個包都定義了異常類,所有這些類都是java.lang.Throwable類的子類;Throwable派生2個子類,Error類和Exception類在Java中的異常類定義:程序中遇到的輕微的錯誤條件,叫做Exception。在Java中,錯誤類定義了程序中不可恢復(fù)的嚴(yán)重的錯誤條件,如內(nèi)存溢出、類文件格式錯誤等,這類錯誤由Java運(yùn)行相同處理,不需要用戶處理,這一類叫做Error。ThrowableErrorExceptionRuntimeExceptionIOException運(yùn)行時(shí)問題示例(RuntimeException)importjava.util.Scanner;publicclassExceptionDemo01{publicstaticvoidmain(Stringargs[]){inta,b;Scannersc=newScanner(System.in);System.out.print("Pleaseinputa=");a=sc.nextInt();System.out.print("Pleaseinputb=");b=sc.nextInt();intc=a/b;System.out.println("c="+c); }}從磁盤文件讀取數(shù)據(jù)進(jìn)行處理(IOException)importjava.io.*;importjava.util.Scanner;publicclassExceptionDemo02{publicstaticvoidmain(Stringargs[]){Stringfilename="Exception.txt";Filef=newFile(filename);Scannersc=newScanner(f); intn;while(sc.hasNextInt()){n=sc.nextInt(); System.out.print("\t"+n);} } }A程序運(yùn)行時(shí)沒有進(jìn)行異常捕捉或聲明拋出出錯從磁盤文件讀取數(shù)據(jù)進(jìn)行處理(IOException)7.01在進(jìn)行磁盤文件操作時(shí),如果沒有進(jìn)行異常捕捉、或者聲明拋出,則可能導(dǎo)致()。B程序編譯時(shí)沒有進(jìn)行異常捕捉或聲明拋出出錯C運(yùn)行時(shí)磁盤數(shù)據(jù)文件找不到才會出錯D編譯時(shí)沒有找到對應(yīng)磁盤數(shù)據(jù)文件出錯表7.1常見異常類一覽表異常類說明所在包ArithmeticException算術(shù)異常,主要因整數(shù)除法中被0除引起的。父類:RuntimeExceptionjava.lang.*ArrayStoreException數(shù)組存儲異常,主要因存儲數(shù)組元素的對象類型錯誤引起的。父類:RuntimeExceptionjava.lang.*ArrayIndexOutOfBoundsException訪問數(shù)組時(shí),索引錯誤,可能是索引超出數(shù)組范圍、或者索引為負(fù)數(shù)。父類:IndexOutOfBoundsExceptionjava.lang.*StringIndexOutOfBoundsException字符串引用索引錯誤,可能是索引超出數(shù)組范圍、或者索引為負(fù)數(shù)。父類:IndexOutOfBoundsExceptionjava.lang.*IndexOutOfBoundsException數(shù)組、字符串、矢量的索引超出范圍引起的異常。父類:RuntimeExceptionjava.lang.*NegativeArraySizeException在創(chuàng)建數(shù)組時(shí),給定的數(shù)組大小為負(fù)值引起的異常。父類:RuntimeExceptionjava.lang.*FileNotFoundException文件沒有找到異常。父類IOExceptionjava.IO.*IOExceptionIO異常,這是一個IO異常基類。父類:Exceptionjava.IO.*異常捕捉與處理在try后“可能出現(xiàn)異常的代碼段”的執(zhí)行中,如果出現(xiàn)異常,系統(tǒng)將生成一個異常的對象,用這個對象與后續(xù)的catch中的對象匹配;匹配上后執(zhí)行對應(yīng)的“處理異常程序段”;如果沒有出現(xiàn)異常,則不會生成異常對象;異常捕捉與處理結(jié)構(gòu)如下:try{
可能出現(xiàn)異常的代碼段}catch(異常類1e1){
處理異常程序段}catch(異常類2e2){
處理異常程序段}……[finally{
程序段}]finally結(jié)構(gòu)是一個可選結(jié)構(gòu),如果有finally結(jié)構(gòu),只要出現(xiàn)異常,無論是否進(jìn)行異常處理,都會執(zhí)行對應(yīng)的程序段。因此,finally結(jié)構(gòu)一般用來關(guān)閉文件、數(shù)據(jù)庫的相關(guān)代碼,因?yàn)槌霈F(xiàn)異常一般程序就需要退出,打開的文件、數(shù)據(jù)庫尚未關(guān)閉,將影響其他線程的使用異常捕捉與處理異常捕捉與處理結(jié)構(gòu)如下:try{
可能出現(xiàn)異常的代碼段}catch{異常類1e1}{
處理異常程序段}catch(異常類2e2){
處理異常程序段}……[finally{
程序段}]在這個結(jié)構(gòu)中,catch語句可以有多個,允許捕捉多種異常對象。注意,有些異常類存在繼承關(guān)系,即有父類和子類的關(guān)系,如IOException是FileNotFoundException類的父類,而Exception又是IOException的父類。因此,在這些catch語句時(shí),必須先進(jìn)行子類對象的捕捉,然后在進(jìn)行父類對象的捕捉;如果先進(jìn)行父類對象的捕捉,則程序無法通過編譯;也就是說,捕捉異常時(shí),要求先捕捉子類、再捕捉父類。下面程序因捕捉異常順序有錯誤,編譯無法通過importjava.util.Scanner;publicclassExceptionDemo03{publicstaticvoidmain(Stringargs[]){ inta,b; Scannersc=newScanner(System.in); System.out.print("Pleaseinputa="); a=sc.nextInt(); System.out.print("Pleaseinputb="); b=sc.nextInt(); try{ intc=a/b; System.out.println("c="+c); }catch(Exceptione1){ System.out.println("對不起,程序執(zhí)行錯誤..."); }catch(ArithmeticExceptione){ System.out.println("對不起,b是除數(shù),不能為0..."); }}}
這類錯誤是因?yàn)楫惓2蹲巾樞蛴袉栴}導(dǎo)致的。因?yàn)镋xception異常是ArithmeticException異常的父類,必須先捕捉子類,再捕捉父類。即按照下面反序捕捉:ThrowableExceptionRuntimeExceptionArithmeticException異常捕捉與處理AArithmeticException、RuntimeException、Exception7.02在異常類中,ArithmeticException類繼承RuntimeException類,RuntimeException類繼承Exception類,如果要捕捉這3類異常,正確的順序是()。BException、ArithmeticException、RuntimeExceptionCRuntimeException、Exception、ArithmeticExceptionDRuntimeException、ArithmeticException、Exception總結(jié)異常:1異常的拋出與捕捉2異常捕捉的基本要求3異常處理2.拋出異常與自定義異常第7章異常處理可拋出異常的方法方法拋出異常格式:如果在一個方法中生成異常,但在這個方法中無法切確知道如何處理這個異常事件,此時(shí),這個方法就應(yīng)該聲明拋出異常,使得異常對象可以從調(diào)用棧向后傳播,直到有合適的方法步驟它為止。也就是說,這個方法可以把異常拋出給調(diào)用者,由調(diào)用者來處理這個異常。權(quán)限修飾符返回值類型方法名(參數(shù)列表)
throws
異常類列表{
方法體}throws是拋出異常關(guān)鍵字異常類列表可以同時(shí)拋出多個異常。多個異常類名用逗號分隔拋出異常處理示例importjava.util.*;publicclassThrowsException{publicstaticlongfactorial(intn){//計(jì)算機(jī)n!longm=1;for(longi=1;i<=n;i++)m*=i;returnm;}publicstaticlong[]sumfact(intn)throwsException{//計(jì)算1!+2!+……+n!long[]m=newlong[n];m[0]=0;//ArrayIndexOutOfBoundsExceptionfor(inti=1;i<=n;i++)m[i]=m[i-1]+factorial(i);returnm;} publicstaticvoidmain(Stringargs[])throwsException{intn;longm[];Scannersc=newScanner(System.in);System.out.print("Pleaseinputn=");try{n=sc.nextInt(); m=sumfact(n);System.out.println("m="+m); }catch(ArrayIndexOutOfBoundsExceptione){System.out.println("數(shù)組下標(biāo)越界....");e.printStackTrace();}catch(InputMismatchExceptione){System.out.println("Sorry,pleaseenteraninteger.");e.printStackTrace();} }}
在這個程序中,sumfact(intn)方法中,可能產(chǎn)生數(shù)組越界,但在這個方法中不對這個異常進(jìn)行處理,而是用ThrowsException拋出異常的方式把異常拋給調(diào)用它的方法main();在main()中進(jìn)行了兩個異常捕捉:ArrayIndexOutOfBoundsException和InputMismatchException,即數(shù)組下標(biāo)越界和輸入類型不匹配;對方法拋出的異常的處理當(dāng)一個方法接受到異常時(shí),該方法可以處理這些異常,也可以不處理這些異常;但如果不處理,則必須繼續(xù)拋出異常,此時(shí)拋出的異常列表必須與被調(diào)用方法的異常列表一致、或者是被調(diào)用方法所列異常的兼容父類。main()方法是所有方法的根,如果前面所有方法都沒有對拋出的異常進(jìn)行處理,那么main()方法就應(yīng)該進(jìn)行處理。如果main()方法也不處理,還可以繼續(xù)拋出,此時(shí),拋給Java的虛擬機(jī),由虛擬機(jī)進(jìn)行處理。對方法拋出的異常的處理A任意一個方法都可以拋出異常給調(diào)用者7.03一個方法拋出異常(throwsException),下面描述中,錯誤的是()。B調(diào)用者接收到異常時(shí)可以繼承拋出異常Cmain()方法是所有方法的根,因此它不能再拋出異常D各級方法拋出異常列表必須一致自定義異常與拋出異常自定義異常類 在Java中,我們可以自定義異常,但要求它必須繼承Exception類或者Throwable類: publicclass異常類名extendsException{ 異常類的構(gòu)造方法 }例子:在Java中,長整型的計(jì)算沒有進(jìn)行相關(guān)的異常類,我們可以自定義一個異常類LongOverflowException,來處理這個問題classLongOverflowExceptionextendsException{publicLongOverflowException(){super("Longoverflow:exceedingthestoragerangeofthelongtype.");}}自定義異常與拋出異常程序自主拋出異常程序自主拋出異常是生成異常對象并拋出的過程。異常對象可以是由虛擬機(jī)生成、或者由某類的實(shí)例生成,也可以由程序生成。在自主拋出異常方法中,必須由程序生成異常對象,接著用語句: throw(異常對象);
或者throw異常對象;
把異常拋出。例如:LongOverflowExceptione=newLongOverflowException();throwe;注意:用throw語句拋出的異常對象必須是Throwable類、或者其子類、或者自定義異常類的實(shí)例,不能拋出其他對象。監(jiān)控計(jì)算過程,當(dāng)計(jì)算值超出long型的容量,拋出異常。importjava.util.*;publicclassThrowLongOverflowException{publicstaticlongfactorial(intn)throwsException{//計(jì)算機(jī)n!longm=1;for(longi=1;i<=n;i++){m*=i;if(m<0)//為負(fù)值時(shí),已經(jīng)超出long范圍,為負(fù)值 thrownewLongOverflowException();}returnm;}publicstaticlong[]sumfact(intn)throwsException{//計(jì)算1!+2!+……+n!long[]m=newlong[n+1];m[0]=0;for(inti=1;i<=n;i++){//ArrayIndexOutOfBoundsExceptionm[i]=m[i-1]+factorial(i);if(m[i]<0)//由于超出long范圍,為負(fù)值 thrownewLongOverflowException();}returnm;}監(jiān)督m值,如果為負(fù)值,表示已經(jīng)超出long的存儲范圍,拋出異常監(jiān)督m[i]值,如果為負(fù)值,表示已經(jīng)超出long的存儲范圍,拋出異常監(jiān)控計(jì)算過程,當(dāng)計(jì)算值超出long型的容量,拋出異常。publicstaticvoidmain(Stringargs[])throwsException{intn;longm[];Scannersc=newScanner(System.in);System.out.print("Pleaseinputn=");try{n=sc.nextInt();m=sumfact(n);for(inti=0;i<m.length;i++) System.out.print("\t"+m[i]);System.out.println(); }catch(ArrayIndexOutOfBoundsExceptione){Sy
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國奢侈品箱包行業(yè)規(guī)模分析及投資策略研究報(bào)告
- 2024-2030年中國半纖維素酶行業(yè)運(yùn)行狀況及投資發(fā)展前景預(yù)測報(bào)告
- 2024年生產(chǎn)車間租賃與產(chǎn)業(yè)基金投資服務(wù)合同3篇
- 質(zhì)量監(jiān)督程序
- 詹凱煜畢業(yè)設(shè)計(jì)報(bào)告書論文
- 2024年度高層建筑基礎(chǔ)施工混凝土供應(yīng)合同范本3篇
- 海南省部分學(xué)校2021-2022學(xué)年高一上學(xué)期期中考試歷史試題
- 2024年城市宣傳片制作與發(fā)布合同范本3篇
- 2025年嘉峪關(guān)道路貨運(yùn)駕駛員從業(yè)資格證考試
- 2025投影系統(tǒng)設(shè)備購銷合同書
- 愛吃糖的大獅子
- 醫(yī)學(xué)小常識幻燈片課件
- 化妝品功效評價(jià)
- 風(fēng)電場通用類作業(yè)行為風(fēng)險(xiǎn)管控清單
- 【幼兒園園本教研】幼兒表征的教師一對一傾聽策略
- GCS評分實(shí)施細(xì)則及要點(diǎn)說明課件
- 英語│英語中考英語閱讀理解(有難度)
- 手術(shù)操作分類代碼國家臨床版3.0
- 采血知情同意書模板
- 我的家鄉(xiāng)廣東廣州宣傳簡介
- 自行車制造業(yè)行業(yè)概述
評論
0/150
提交評論