第四講 Java的異常處理.ppt_第1頁
第四講 Java的異常處理.ppt_第2頁
第四講 Java的異常處理.ppt_第3頁
第四講 Java的異常處理.ppt_第4頁
第四講 Java的異常處理.ppt_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

java的異常處理,伍淳華 北京郵電大學(xué)計(jì)算機(jī)學(xué)院,java,java的異常處理,什么是異常,異常就是在程序的執(zhí)行過程中所發(fā)生的異常事件,它中斷指令的正常執(zhí)行,java,java的異常處理,異常處理,可能出現(xiàn)的問題 用戶輸入錯(cuò)誤 設(shè)備錯(cuò)誤 物理限制 代碼錯(cuò)誤,java,java的異常處理,異常(throwable)分類,throwable:所有異常的根類 error:throwable的直接子類 動態(tài)鏈接失敗,虛擬機(jī)錯(cuò)誤等。通常java程序不應(yīng)該捕獲這類異常,也不會拋棄這種異常。,java,java的異常處理,異常(throwable)分類,exception 運(yùn)行時(shí)異常 繼承于runtimeexception.java 一般是由于程序錯(cuò)誤產(chǎn)生 -錯(cuò)誤的類型轉(zhuǎn)換 -數(shù)組訪問越界 -訪問空指針 編譯器允許不對它們做出處理(unchecked) “如果出現(xiàn)runtimeexception異常,就一定是你的問題”,java,java的異常處理,異常(throwable)分類,exception 非運(yùn)行時(shí)異常 除了運(yùn)行時(shí)異常之外的其它的繼承自exception的異常類。 程序曾經(jīng)能夠正常運(yùn)行,但由于某種情況的變化,導(dǎo)致異常出現(xiàn),程序不能正常運(yùn)行。 -文件不存在 -用戶輸入錯(cuò)誤 編譯器要求程序必須對這類異常進(jìn)行處理(checked),java,java的異常處理,java,java的異常處理,異常示例,import java.io.*; class exceptiondemo1 public static void main(string args) fileinputstream fis=new fileinputstream(“text”); int b; while(b=fis.read()!=-1) system.out.print(b); fis.close(); ,java,java的異常處理,異常示例,c:javac exceptiondemo1.java exceptiondemo1.java:6:exception java.io.filenotfoundexception must be caught,or it must be declared in the throws clause of this method fileinputstream fis=new fileinputstream(“text”); exceptiondemo1.java:8:exception java.io.ioexception must be caught,or it must be declared in the throws clause of this method while(b=fis.read()!=-1),java,java的異常處理,異常處理,class exceptiondemo2 public static void main(string args) int a=0; system.out.println(5/a); ,java,java的異常處理,異常處理,c:/javac exceptiondemo2.java c:/java exceptiondemo2 java.lang.arithemeticexception:/by zero at exceptiondemo2.main(exceptiondemo2.java:4),java,java的異常處理,異常處理機(jī)制,在java的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會生成一個(gè)異常對象。java有兩種對異常的處理方式: 拋棄異常:方法內(nèi)部產(chǎn)生異常的地方,生成一個(gè)異常對象,并將該異常對象提交給方法的調(diào)用者,這一異常的生成和提交過稱成為拋棄(throw)異常 捕獲異常:當(dāng)java運(yùn)行時(shí)得到一個(gè)異常對象時(shí),它將會尋找處理這一異常的代碼。找到能夠處理這種類型的異常的方法后,系統(tǒng)把當(dāng)前異常對象交給這個(gè)方法處理,這一過程成為捕獲(catch)異常,java,java的異常處理,拋棄異常,聲明拋棄異常 如果在一個(gè)方法中生成了一個(gè)異常,但是這一方法并不確切的知道如何對這一異常事件進(jìn)行處理,這時(shí),一個(gè)方法就應(yīng)該聲明拋棄異常。 “一個(gè)方法不僅需要告訴編譯器將要返回什么值,還要告訴編譯器可能發(fā)生什么異常”,java,java的異常處理,拋棄異常,聲明拋棄異常 聲明拋棄異常是在一個(gè)方法聲明中的throw子句中指明的。例如 public fileinputstream(string name )throws ioexception throws子句中可以同時(shí)指明多個(gè)異常,說明該方法將不對這些異常進(jìn)行處理,而是聲明拋棄它們。 public static void main(string args)throws ioexception,indexoutofboundsexception,java,java的異常處理,拋棄異常,如何拋棄異常 拋棄異常首先要生成異常對象 ,異常對象可由某些類的實(shí)例生成,也可以由java虛擬機(jī)生成。拋棄異常對象時(shí)通過throw語句實(shí)現(xiàn)。 ioexception e=new ioexception( ); throw e; 可以拋棄的異常必須是throwable或者其子類的實(shí)例。 下面的語句在編譯時(shí)將會產(chǎn)生語法錯(cuò)誤 throw new string(“want to throw”);,java,java的異常處理,拋棄異常,對于已存在的異常類,拋出該異常非常容易 找到一個(gè)合適的異常類; 創(chuàng)建這個(gè)類的一個(gè)對象; 將該對象拋出;,java,java的異常處理,拋棄異常,對于已存在的異常類,拋出該異常非常容易 string readdata(scanner in)throws eofexception while() if(!in.hasnext( ) if(nlen) throw new eofexception( ); ,java,java的異常處理,自定義異常類,自定義異常類即是定義一個(gè)派生于exception的直接或間接子類;如一個(gè)派生于ioexception的類。 一般情況下,定義的異常類應(yīng)該包括兩個(gè)構(gòu)造器,一個(gè)是默認(rèn)的構(gòu)造器,一個(gè)是帶有詳細(xì)描述信息的構(gòu)造器(超類throwable的tostring方法會打印出這些詳細(xì)信息,有利調(diào)試代碼),java,java的異常處理,自定義類,class fileformatexception extends ioexception public fileformatexception() public fileformatexception(string gripe) super(gripe); ,java,java的異常處理,自定義類,string readdata(bufferedreader in)throws fileformatexception while() if(ch=read()=-1) if(nlen) throw new fileformatexception(“file format error!”); ,java,java的異常處理,捕獲異常 捕獲異常是通過try-catch-finally語句實(shí)現(xiàn)的 try catch(exceptionname1 e) catch(exceptionname2 e) finally ,java,java的異常處理,try 捕獲異常的第一步使用try選定捕獲異常的范圍,由try所限定的代碼塊中的語句在執(zhí)行過程中可能會生成異常對象,java,java的異常處理,catch -每個(gè)try代碼塊可以伴隨一個(gè)或多個(gè)catch語句,用于處理try代碼塊中所生成的異常事件。 -catch語句只需要一個(gè)形式參數(shù)指明它所能捕獲的異常類型,這個(gè)類必須是throwable的子類,運(yùn)行時(shí)系統(tǒng)通過參數(shù)值把被拋棄的異常對象傳寄給catch塊 -在catch塊中是對異常對象進(jìn)行處理的代碼,與訪問其他對象一樣,可以訪問一個(gè)異常對象的變量或調(diào)用它的方法。getmessage()是類throwable所提供的方法,用來得到有關(guān)異常事件的信息,類throwable還提供了方法printstacktrace()用來跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容,java,java的異常處理,try catch(filenotfoundexception e) system.out.println(e); system.out.println(“message:”+e.getmessage(); e.printstacktrace(system.out); catch(ioexception e) system.out.println(e); ,java,java的異常處理,catch語句的順序,捕獲異常的順序和不同catch語句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí)。剩下的catch語句就不再進(jìn)行匹配。 因此在安排catch語句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后在逐漸一般化,也就是一般先安排子類,再安排父類。,java,java的異常處理,finally 捕獲異常的最后一步是通過finally語句為異常處理提供一個(gè)統(tǒng)一的出口,使得控制流程轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)做統(tǒng)一的管理。不論在try代碼塊中是否發(fā)生了異常事件,finally塊中的語句都會被執(zhí)行。,java,java的異常處理,try /1 code that might throw exceptions /2 catch(ioexception e) /3 show error dialog finally /4 /5 ,java,java的異常處理,程序沒有產(chǎn)生異常,1-2-4-5 程序產(chǎn)生了一個(gè)可被catch捕獲的異常:1-3-4-5 程序產(chǎn)生了一個(gè)不能被catch捕獲的異常:1-4,java,java的異常處理,異常處理,積極處理 消極處理,java,java的異常處理,異常處理,例: fileinputstream(string name)throws filenotfoundexception import java.io.*; class exceptiondemo1 public static void main (string args) fileinputstream fis=new fileinputstream(“text”); ,java,java的異常處理,異常處理,積極處理方式 import java.io.*; class exceptiondemo1 public static void main (string args) try fileinputstream fis=new fileinputstream(“text”); catch(filenotfoundexcption e) ,java,java的異常處理,異常處理,消極處理方式 import java.io.*; class exceptiondemo1 public static void main (string args) throws filenotfoundexcption fileinputstream fis=new fileinputstream(“text”); ,java,java的異常處理,異常處理,處理原則 捕獲那些知道如何處理的異常; 將不知道如何處理的異常拋出;,java,java的異常處理,使用異常機(jī)制的建議,(1)異常不能代替簡單的測試:只在異常情況下使用異常機(jī)制 例:上百萬地對一個(gè)空棧進(jìn)行退棧操作 if(!s.empty() s.pop(); try( ) s.pop(); catch(emptystackexception e) ,java,java的異常處理,使用異常機(jī)制的建議,_ test throw/catch _ 154 milliseco

溫馨提示

  • 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

提交評論