【圖文】Java異常處理(精)_第1頁
【圖文】Java異常處理(精)_第2頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、JAVA甲第8辛Java舟常比理&丄什么是異帶異常(Exception)也叫例外。在Java編程語占屮,異常就是程 序在運(yùn)行過程中山于硬件設(shè)備間題、軟件設(shè)計(jì)錯(cuò)誤、缺陷等 驚制緋序嘗肋在軟件開發(fā)過程中,很多情況都將導(dǎo)致異(1) B打開胡文件不存在:(2)網(wǎng)絡(luò)連接中斷,(3)操作數(shù)超出預(yù)定范國;(4)正在裝載的類文件丟失;(5)訪問的數(shù)據(jù)庫打不開;可見,在程序中產(chǎn)生異常的現(xiàn)象是非常普遍的。 在Java編程 語言中,對(duì)異常的處理冇卄常完備的機(jī)制。異常本身作為一 個(gè)對(duì)象,產(chǎn)牛異常就是產(chǎn)牛一個(gè)異常對(duì)彖。這個(gè)對(duì)象町能由 應(yīng)用程序本身產(chǎn)牛.,也可能由Java虛擬機(jī)產(chǎn)生,這取決于 產(chǎn)主異常的類世。該異

2、常對(duì)象屮包描了異常事件的類世以及 發(fā)牛 杲常時(shí)應(yīng)用程序H前的狀態(tài)和調(diào)用過程。請(qǐng)看下面產(chǎn)生 異常餉例學(xué)。/ Exceptionl.javaimport java.io.*;class Exceptionl public static void main(String args)Fileinputstream fis =new FilelnputStreamCtext.txt);int b;while(b=fis.read()! = -l) System, out. print(b);fis.close();JAVA占8丄什JAVA半編譯這個(gè)程序時(shí),屏幕卜會(huì)輸出卜面的信息;D:userchap08

3、javac Exception 1.javaException 1.java:5: unreported exception java.io.FileNotFoundException;must be caught or declared to be thrownFileinputstream fis = new FileinputStream(Htext.txt*);AExceptioni.java:7: unreported exception java.io.IOException; must be caughtor declared to be thrownwhile(b=fis.re

4、ad()!=-l) AExceptionl.java:10: unreported exception java.io.IOExc亡ption; must becaught ordeclared to be thrownfis.dose();A3 errors占8 1什么是異常【例8-21數(shù)組下標(biāo)超界的例于/ Exception2.javapublic class Exception2public static void main (String args) String langs = JavaVVisaul Basic,zC4-+; int i = 0;while (i javac Exc

5、eption2.javaD:userchap08java Exception2JavaVisaul BasicC+Exception in thread main1javag.ArrayindexOutOfBoundsException: 3at Exception2.main(Exception2 java:8)上面的例子編譯町以通過,但運(yùn)行時(shí)出現(xiàn)異常信息被拋出。在H循環(huán)被執(zhí)行四次之后,數(shù)組卜一標(biāo)溢出,程序終比,并帶有 錯(cuò)誤信息,就象前面所示的程序那樣。,【例8-3被0除的例子/ Exception3 .javaclass Exception3public static void main(

6、String args)int a=0;System.out.printl n(5/a);我們編譯這個(gè)程序得到其字節(jié)碼文件,然后運(yùn)行它.屏幕上的顯示如下:D:userchap08javac Exception3.java D:userchap08java Exception3Exception in threadnmainHjava.Iang.ArithmeticException: / by zeroat Exception3.main(Exception3.java:5)內(nèi)為除數(shù)不能為 6 所以在程序運(yùn)行的時(shí)像出現(xiàn)了除以Q溢出的異常事件。丄在上面的三個(gè)例子中,我們都遇到了異常。屏幕匕所顯示

7、 的信息分別指明了異常的類烈以及異常所在的包同時(shí)我們也 可以看到,對(duì)于某些界常,在程序中必須對(duì)它進(jìn)行處理,否 則編譯程序會(huì)抬汨錯(cuò)以(如例8 1)。但對(duì)另些異常,在程序 中可以不做處理,而直接由運(yùn)行時(shí)系統(tǒng)來處理(如例8-3)o在 下節(jié)中,我們將詳細(xì)了解這兩類丹常,以及在程序中如何處理這兩類異常。&丄什么是異帝JAVA3N3g IOException、對(duì)象。這個(gè)對(duì)彖可能是由正在運(yùn)行的方法生成,也可能由Java虛擬機(jī)生成, 其中包含一些信息指明異常事件的類型以及當(dāng)異常發(fā)牛時(shí)程序的運(yùn)行狀態(tài) 等。Java語言提供兩種處理異常的機(jī)制:(1)捕獲異常在Java程序運(yùn)行過程屮系統(tǒng)得到一個(gè)異常對(duì)彖時(shí),它

8、將會(huì)沿著方法的 調(diào)用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型異常 的方法后,運(yùn)行時(shí)系統(tǒng)把當(dāng)前異常對(duì)象交給這個(gè)方法進(jìn)行處理,這-過程 稱為捕獲(catch)異常。這是-種積極的異常處理機(jī)制。如果Java運(yùn)行時(shí)系 統(tǒng)找不到可以捕獲異常的方法,則運(yùn)行時(shí)系統(tǒng)將終止,相應(yīng)的Java程序也 將退出。8.2丄Java的異常處理機(jī)制就會(huì)生成一個(gè)JAVA(2)聲明拋棄異常當(dāng)Java程序運(yùn)行時(shí)系統(tǒng)得到一個(gè)異常對(duì)彖時(shí),如果一個(gè)方法并不知道如何 處理所出現(xiàn)的異常,則可在方法聲明時(shí),聲明拋棄(throws)異常。前面已纟仝提到,Java 足采用廁向刈象的方法來處理借決的,-個(gè)丹常爭件足 由一個(gè)片常對(duì)象來

9、代衣的-這些異常對(duì)象都對(duì)T javaJang.Throwable 及其子 類 a 下面我們就來看下杲常類的層次。在 java 類庫的每個(gè)包中都定義 f fl d 的異常類,所有這些類都直接或間接地 繼承于Throwable 圖 8J 列舉了 些丹常類并指明它們的繼承關(guān)系。從圖 8-lnj 以看出,Java 屮的井常事件分為兩大類。類繼承 J 炎 Error.它的繼 承關(guān)系如下上javaan g.Objectjavadng .Throwablejavaang. ErrorJAVAJAVA常見的錯(cuò)誤類 /jAnnotationFormatError, Assertion Error, AWTErr

10、or, LinkageError,CoderMa If u nction Error, Factory Conf ig u ration E rror, ThreadDeath,VirtualMachineError, TransformerFactoryConfigurationError 等,包括動(dòng)態(tài)鏈接失 敗、線程死鎖、圖形界面錯(cuò)誤.虎擬機(jī)錯(cuò)誤等,通常 Java 程序不應(yīng)該捕獲這類片 常,也不會(huì)拋介:這種異常。刃外類井常則繼承于類 Exception,這是 JavafV.Jp 中所人量處理的杲常。它的繼承 關(guān)蔡如卞$java Jang.Objectjavaang.Th rowa blej

11、ava.lang.Exception常見的斤常灸自:AcINotFoundException, ApplicationException, AWTException,BackingStoreException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, DestroyFailedException, ExecutionException, PrintException,GeneraISecurityException, InterruptedException,In validPrefere

12、 rKesFonnatException,Parse Exception, RuntimeException,SAXException, SQLException, TimeoutException, TransformerException,UnsupportedCallbackException, UnsupportedLookAndFeelException,URISyntaxException, UserException, XAException, XMLParseException,XPathException 等其屮包描J運(yùn)行時(shí)異常&非運(yùn)行時(shí)異常。2.2異JAVAL_常見

13、的非運(yùn)行時(shí)并常如卜:(1) ClassNotFoundException :找不到類或接口所產(chǎn)生的異常(2) CloneNotSupportedException:使用對(duì)象的 clone 方法但無法執(zhí)行 Cloneable 所產(chǎn)生的異常。IllegalAccessException :類定義不明確所產(chǎn)牛的異常。例如:類不為 public , 或是包含一個(gè)類定義在另一個(gè)類庫內(nèi)。(4) IOException :在一般帖況下不能完成 I/O 操作所產(chǎn)生的異常。EOFException:打開文件沒右數(shù)據(jù)町以讀取所產(chǎn)空的異常FileNotFoundException :在文件系統(tǒng)中,找不到文件名稱或路

14、徑所產(chǎn)生InterruptedlOException:目前線程等待執(zhí)行,另一線程中斷目前線程 I/O 運(yùn)行所 產(chǎn)生的異常在 Sun 公司提供的各種 API 包中,iiljava .io, java .net, java .awt 等,都提供不同怙況卜町能產(chǎn)生的異常。由于異常的種類非常多,需要讀者實(shí)際運(yùn)用中逐漸掌握。占8 2 2異常類的類層次常見的運(yùn)行時(shí)異常如下:(1) 類型轉(zhuǎn)換異常ClassCastExceptionStringstrNa(2) 數(shù)組超界異常(3) 指定數(shù)組維數(shù)為負(fù)值異常(4) 算術(shù)異常 ArithmeticException int b=0;a=500/b;(5) Java

15、系統(tǒng)內(nèi)部異InternalExceptionJVM 拋出的異常(6) 類型不符合異 Vr/IncompatiblelypeException intn=12345;String s=(String)n;(7) 內(nèi)存溢出異常 OutOfMemeoryException(8) 沒有找到類定義異常NoClassDefFoundExceptionaClass aa=new aClas(); 但 aClass 類未泄義。(9) 空指針異常 NullPointerException int b;b0=99; 沒有實(shí)例化,就訪問,將產(chǎn)生空指 針。占8 2 2異常類的類層次JAVAJAVAjava.Ing.T

16、hrowable 類是所有 Error 類和 Exception 類的父類,常用的方法有 fillInStackTrace()、getLocalizedMessage() getMessage()、printStackTrace() printStackTrace(PrintStream)printStackTrace(Printwriter) toString()。(1) public native Throwable fillInStackTrace()填弓執(zhí)行堆棧跟蹤信息。該力法任應(yīng)用程序豆新拋出錯(cuò) i 吳或異常時(shí)仔用。例如:try a = b / c; catch(Arithmetic

17、Throwable e) a = Number.MAXVALUE;throw e.fillInStackTrace();(2) public String getLocalizedMessage()生成該 Throwable 的本地化描述。子類可能會(huì)覆蓋該方法以便產(chǎn)生一個(gè)特定于本 地狗消息。對(duì)于未覆蓋該方法的子類,缺省地返回調(diào)用 getMessage()的結(jié)果。8.2 3 Throwable類的常用方法(3) public String getMessage()返回該 throwable 對(duì)象的詳細(xì)信息。如果該對(duì)彖沒有詳細(xì)信息則返回 null。(4) public void printStac

18、kTrace()把該 Throwable 和它的跟蹤情況打印到標(biāo)準(zhǔn)錯(cuò)誤流。(5) public void printStacklrace(PrintStream s)把該 Throwable 和它的跟蹤情況打印到指定打印流。(6) public void printStackTrace(PrintWriter s)把該 Throwable 和它的跟蹤情況打印到指定打印流。(7) public String toString()返回該 throwable 對(duì)象的嗇短字符串描述。&2.3JAVAJAVA方法可捕獲該種異常。捕獲異常是通iitry-catch-finally句實(shí)現(xiàn)的。其語 建

19、為:trycatch( ExceptionNamel e ) catch( ExceptionName2 e )finally1、try捕獲異常的第一步是用try.選定捕獲異常削范圍,由try所限定的 代碼塊中的語句在執(zhí)行過程中可能會(huì)生成異常對(duì)象并拋弁。J &3.1ttry-catch-finallycatch每個(gè) try 代碼塊可以伴隨-個(gè)或多個(gè) catch 語句,用于處理 try 代碼塊屮所生成 的異常寄件。 catchin 句只需要一個(gè)形式參數(shù)來指明它所能夠捕獲的異常類型, 這個(gè)類必須是Throwable 的子類,運(yùn)行時(shí)系統(tǒng)通過參數(shù)值把被拋棄的異常對(duì)象 傳遞給 catch 塊。c

20、atch 塊中的代碼用來對(duì)異常對(duì)象進(jìn)行處理,與訪問其它對(duì)象一樣,町以訪問 個(gè)界常對(duì)彖的變量或調(diào)用它的方法。getMessage()是類 Throwable 所提供 的方法,用來得到有關(guān)異常事件的信息,類 Throwable 還提供了方法 printStackTrace()用來跟蹤并常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。例如:trycatch( FileNotFoundException e )System.out.println( e );System.out.printingnmessage: +e.getMessage();e.printStacklrace( System.out);catch(

21、IOException e )System.out.println( e );&3.:!&3.:!一個(gè)方一個(gè)方JAVAJAVAcatch語句的順序捕獲異常的順丿了和 catch 語句的順丿了有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下的catch 語句就不再進(jìn)行匹配。因此,在安排 catch 語句的順序時(shí),首先應(yīng)該捕 獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。 例如上面的程序如果安排成如下的形式:trycatch(IOException e )System.out.println( e );System.out.println( message: +e.getMes

22、sage();e.printStackl?ace( System.out);catch(FileNotFoundException e ) System.out.println( e );由于第一個(gè)catch語句首先得到I兀配, 第二個(gè)catch語句將不會(huì)被執(zhí)行。 編譯 時(shí)將出現(xiàn)“catchnot reached的錯(cuò)謀。 finally捕獲異常的最后一步是通過 finally 語句為異常處理提供個(gè)統(tǒng)一的出口,使 得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)-的管理。一 般是用來關(guān)閉文件或釋放其他的系統(tǒng)資源。雖然 finally 作為 tycatch-finally 結(jié) 構(gòu)的一部分,但

23、在程序是可選的,也就是說可以沒有 finally 語句。如果存在 finally 語句,不論 try 塊中是否發(fā)生了異常,是否執(zhí)行過 catch 語句,都要執(zhí)行 finally 語句。另外,try-catch-finaltynj 以嵌套。&3丄try-catch-finally&3丄java Exception6Caught ExceptiongetMessage():My Exception getLocalizedMessage():My ExceptiontoString():javaang.Exception: My Exception prin tStacklrace

24、():java.lang.Exception: My Exceptionat Excep廿on6.main(Exception6java:5)8 3 IJ8-6】顯示拋出異常詳細(xì)情況的例子JAVAJAVAJ8-7 try-catch-finally嵌套的例子class MyoneException extendsException public class Trylnbed public static void main(String args) System.out.printlnCEntering first try block11);System.out.println(lEnterin

25、g second try block); try throw new MyoneException(); finally System.out.println(lfinally in 2nd try block11);/try-catch-finally嵌套在try限定的范宙內(nèi)。 catch (MyoneException e) System.err.println(vlCaught MyoneException in 1st tryblock11); finally System.err.println(vfinally in 1st try block11);I 8 3 3拋岀異常序運(yùn)行結(jié)

26、果如下:Entering first try blockEntering second try block finally in 2nd try blockCaught MyoneException in 1st try block finally in 1st try block8.3.3JAVAJAVA什么是異常&2 異常處理機(jī)制&3 異常的處理自己的異常類型。從Java異常類的結(jié)構(gòu)層次可以看出,Java界常的公共父類為Throwableo在程序運(yùn)行中可能出現(xiàn)兩種問題:一種是由碩件系統(tǒng)或JVM導(dǎo)致的故障,Java定義該故障為Error 這類問題用戶程序不能夠處理的。另外一種

27、問題是程序運(yùn)行錯(cuò)謀,Java定義為Exceptiono這種情況下, 可以通&4創(chuàng)&4創(chuàng)建用戶異常類我們可以設(shè)計(jì)JAVAJAVA過程序設(shè)計(jì)的調(diào)整來實(shí)現(xiàn)異常處理。因此,用戶定義的異常類型必須是Throwable的直接或間接子類。Java推薦用戶的異常類型以Exception為直接父類。創(chuàng)建用戶異常的方法如 下:class UserException extendsException UserExcepti on()super();其它語句&4創(chuàng)建用戶異常類在使用異常時(shí),有以下兒點(diǎn)建議需要注意:(1)對(duì)于運(yùn)行時(shí)例外,如果不能預(yù)測(cè)它何時(shí)發(fā)生,程序町以不做處理,而是止 Java 虛機(jī)去處理它。(2) 如果程序可以預(yù)知運(yùn)行時(shí)例外可能發(fā)生的地點(diǎn)和時(shí)間,則應(yīng)該在程序中進(jìn)行 處理,而不應(yīng)簡單地把它交給運(yùn)行時(shí)系統(tǒng)。(3)在自定義異常類時(shí),如果它所對(duì)應(yīng)的異常事件通常總是在運(yùn)行時(shí)產(chǎn)生的, 而且不容易預(yù)測(cè)它將在何時(shí).何處發(fā)生,則可以把它定義為運(yùn)行時(shí)例外,否則應(yīng) 定義為非運(yùn)行時(shí)例外。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論