




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
《Java程序設(shè)計》《Java程序設(shè)計》1第8章Java異常處理8.1什么是異常8.2異常處理機制8.3異常的處理8.4創(chuàng)建用戶異常類第8章Java異常處理8.1什么是異常28.1什么是異常異常(Exception)也叫例外。在Java編程語言中,異常就是程序在運行過程中由于硬件設(shè)備問題、軟件設(shè)計錯誤、缺陷等導(dǎo)致的程序錯誤。在軟件開發(fā)過程中,很多情況都將導(dǎo)致異常的產(chǎn)生,例如:(1)想打開的文件不存在;(2)網(wǎng)絡(luò)連接中斷;(3)操作數(shù)超出預(yù)定范圍;(4)正在裝載的類文件丟失;(5)訪問的數(shù)據(jù)庫打不開;可見,在程序中產(chǎn)生異常的現(xiàn)象是非常普遍的。在Java編程語言中,對異常的處理有非常完備的機制。異常本身作為一個對象,產(chǎn)生異常就是產(chǎn)生一個異常對象。這個對象可能由應(yīng)用程序本身產(chǎn)生,也可能由Java虛擬機產(chǎn)生,這取決于產(chǎn)生異常的類型。該異常對象中包括了異常事件的類型以及發(fā)生異常時應(yīng)用程序目前的狀態(tài)和調(diào)用過程。請看下面產(chǎn)生異常的例子。8.1什么是異常異常(Exception)也叫例外。在Ja38.1什么是異?!纠?-1】文件操作將產(chǎn)生異常//Exception1.javaimportjava.io.*;classException1{publicstaticvoidmain(Stringargs[]){FileInputStreamfis=newFileInputStream("text.txt");intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}8.1什么是異常【例8-1】文件操作將產(chǎn)生異常48.1什么是異常當(dāng)編譯這個程序時,屏幕上會輸出下面的信息:D:\user\chap08>javacException1.javaException1.java:5:unreportedexceptionjava.io.FileNotFoundException;mustbecaughtordeclaredtobethrownFileInputStreamfis=newFileInputStream("text.txt");^Exception1.java:7:unreportedexceptionjava.io.IOException;mustbecaughtordeclaredtobethrownwhile((b=fis.read())!=-1){^Exception1.java:10:unreportedexceptionjava.io.IOException;mustbecaughtordeclaredtobethrownfis.close();^3errors8.1什么是異常當(dāng)編譯這個程序時,屏幕上會輸出下面的信息:58.1什么是異?!纠?-2】數(shù)組下標(biāo)超界的例子//Exception2.javapublicclassException2{publicstaticvoidmain(Stringargs[]){Stringlangs[]={"Java","VisaulBasic","C++"};inti=0;while(i<4){System.out.println(langs[i]);i++;}}}
8.1什么是異常【例8-2】數(shù)組下標(biāo)超界的例子68.1什么是異常程序的編譯和運行結(jié)果如下:D:\user\chap08>javacException2.javaD:\user\chap08>javaException2JavaVisaulBasicC++Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3atException2.main(Exception2.java:8)上面的例子編譯可以通過,但運行時出現(xiàn)異常信息被拋出。在其循環(huán)被執(zhí)行四次之后,數(shù)組下標(biāo)溢出,程序終止,并帶有錯誤信息,就象前面所示的程序那樣。8.1什么是異常程序的編譯和運行結(jié)果如下:78.1什么是異常【例8-3】被0除的例子//Exception3.javaclassException3{publicstaticvoidmain(Stringargs[]){inta=0;System.out.println(5/a);}}我們編譯這個程序得到其字節(jié)碼文件,然后運行它,屏幕上的顯示如下:D:\user\chap08>javacException3.javaD:\user\chap08>javaException3Exceptioninthread"main"java.lang.ArithmeticException:/byzeroatException3.main(Exception3.java:5)因為除數(shù)不能為0,所以在程序運行的時候出現(xiàn)了除以0溢出的異常事件。8.1什么是異?!纠?-3】被0除的例子88.1什么是異常在上面的三個例子中,我們都遇到了異常。屏幕上所顯示的信息java.io.IOException、java.io.FileNotFoundException、java.lang.ArrayIndexOutOfBoundsException以及java.lang.ArithmeticException分別指明了異常的類型以及異常所在的包。同時我們也可以看到,對于某些異常,在程序中必須對它進行處理,否則編譯程序會指出錯誤(如例8-1)。但對另一些異常,在程序中可以不做處理,而直接由運行時系統(tǒng)來處理(如例8-3)。在下節(jié)中,我們將詳細了解這兩類異常,以及在程序中如何處理這兩類異常。
8.1什么是異常在上面的三個例子中,我們都遇9第8章Java異常處理8.1什么是異常8.2異常處理機制8.3異常的處理8.4創(chuàng)建用戶異常類第8章Java異常處理8.1什么是異常108.2異常處理機制8.2.1Java的異常處理機制8.2.2異常類的類層次8.2.3Throwable類的常用方法8.2異常處理機制8.2.1Java的異常處理機制118.2.1Java的異常處理機制
在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會生成一個異常對象。這個對象可能是由正在運行的方法生成,也可能由Java虛擬機生成,其中包含一些信息指明異常事件的類型以及當(dāng)異常發(fā)生時程序的運行狀態(tài)等。Java語言提供兩種處理異常的機制:(1)捕獲異常在Java程序運行過程中系統(tǒng)得到一個異常對象時,它將會沿著方法的調(diào)用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型異常的方法后,運行時系統(tǒng)把當(dāng)前異常對象交給這個方法進行處理,這一過程稱為捕獲(catch)異常。這是一種積極的異常處理機制。如果Java運行時系統(tǒng)找不到可以捕獲異常的方法,則運行時系統(tǒng)將終止,相應(yīng)的Java程序也將退出。(2)聲明拋棄異常當(dāng)Java程序運行時系統(tǒng)得到一個異常對象時,如果一個方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時,聲明拋棄(throws)異常。8.2.1Java的異常處理機制在J128.2.2異常類的類層次前面已經(jīng)提到,Java是采用面向?qū)ο蟮姆椒▉硖幚礤e誤的,一個異常事件是由一個異常對象來代表的。這些異常對象都對應(yīng)于類java.lang.Throwable及其子類。下面我們就來看一下異常類的層次。在java類庫的每個包中都定義了自己的異常類,所有這些類都直接或間接地繼承于類Throwable。圖8-1列舉了一些異常類并指明了它們的繼承關(guān)系。從圖8-1可以看出,Java中的異常事件分為兩大類。一類繼承于類Error,它的繼承關(guān)系如下:java.lang.Objectjava.lang.Throwablejava.lang.Error常見的錯誤類有AnnotationFormatError,AssertionError,AWTError,LinkageError,CoderMalfunctionError,FactoryConfigurationError,ThreadDeath,VirtualMachineError,TransformerFactoryConfigurationError等,包括動態(tài)鏈接失敗、線程死鎖、圖形界面錯誤、虛擬機錯誤等,通常Java程序不應(yīng)該捕獲這類異常,也不會拋棄這種異常。
8.2.2異常類的類層次前面已經(jīng)提到138.2.2異常類的類層次另外一類異常則繼承于類Exception,這是Java程序中所大量處理的異常。它的繼承關(guān)系如下:java.lang.Objectjava.lang.Throwablejava.lang.Exception常見的異常類有:AclNotFoundException,ApplicationException,AWTException,BackingStoreException,ClassNotFoundException,CloneNotSupportedException,DataFormatException,DestroyFailedException,ExecutionException,PrintException,GeneralSecurityException,InterruptedException,InvalidPreferencesFormatException,ParseException,RuntimeException,SAXException,SQLException,TimeoutException,TransformerException,UnsupportedCallbackException,UnsupportedLookAndFeelException,URISyntaxException,UserException,XAException,XMLParseException,XPathException
等其中包括了運行時異常和非運行時異常。
8.2.2異常類的類層次另外一類異常則繼承于類Except148.2.2異常類的類層次
8.2.2異常類的類層次158.2.2異常類的類層次
常見的運行時異常如下:(1)類型轉(zhuǎn)換異常ClassCastExceptionStringstrName=newstring(“123”);intnNumber=(int)strName;(2)數(shù)組超界異常ArrayIndexOutBoundsExceptionint[]b=newint[10];b[10]=1000;(3)指定數(shù)組維數(shù)為負值異常NegativeArraySizeExceptionb[-1]=1001;(4)算術(shù)異常ArithmeticExceptionintb=0;a=500/b;(5)Java系統(tǒng)內(nèi)部異常InternalExceptionJVM拋出的異常。(6)類型不符合異常IncompatibleTypeExceptionintn=12345;Strings=(String)n;(7)內(nèi)存溢出異常OutOfMemeoryException(8)沒有找到類定義異常NoClassDefFoundExceptionaClassaa=newaClas();//但aClass類未定義。(9)空指針異常NullPointerExceptionintb[];b[0]=99;//沒有實例化,就訪問,將產(chǎn)生空指針。8.2.2異常類的類層次常見的運行時異常如下:(4)168.2.2異常類的類層次
常見的非運行時異常如下:(1)ClassNotFoundException:找不到類或接口所產(chǎn)生的異常(2)CloneNotSupportedException:使用對象的clone方法但無法執(zhí)行Cloneable所產(chǎn)生的異常。(3)IllegalAccessException:類定義不明確所產(chǎn)生的異常。例如:類不為public,或是包含一個類定義在另一個類庫內(nèi)。(4)IOException:在一般情況下不能完成I/O操作所產(chǎn)生的異常。(5)EOFException:打開文件沒有數(shù)據(jù)可以讀取所產(chǎn)生的異常(6)FileNotFoundException:在文件系統(tǒng)中,找不到文件名稱或路徑所產(chǎn)生(7)InterruptedIOException:目前線程等待執(zhí)行,另一線程中斷目前線程I/O運行所產(chǎn)生的異常在Sun公司提供的各種API包中,如java.io,,java.awt等,都提供不同情況下可能產(chǎn)生的異常。由于異常的種類非常多,需要讀者實際運用中逐漸掌握。
8.2.2異常類的類層次常見的非運行時異常如下:178.2.3Throwable類的常用方法
java.lng.Throwable類是所有Error類和Exception類的父類,常用的方法有fillInStackTrace()、getLocalizedMessage()、getMessage()、printStackTrace()、printStackTrace(PrintStream)、printStackTrace(PrintWriter)、toString()。(1)publicnativeThrowablefillInStackTrace()填寫執(zhí)行堆棧跟蹤信息。該方法在應(yīng)用程序重新拋出錯誤或異常時有用。例如:try{a=b/c;}catch(ArithmeticThrowablee){a=Number.MAX_VALUE;throwe.fillInStackTrace();}(2)publicStringgetLocalizedMessage()生成該Throwable的本地化描述。子類可能會覆蓋該方法以便產(chǎn)生一個特定于本地的消息。對于未覆蓋該方法的子類,缺省地返回調(diào)用getMessage()的結(jié)果。8.2.3Throwable類的常用方法java.ln188.2.3Throwable類的常用方法
(3)publicStringgetMessage()返回該throwable對象的詳細信息。如果該對象沒有詳細信息則返回null。(4)publicvoidprintStackTrace()把該Throwable和它的跟蹤情況打印到標(biāo)準(zhǔn)錯誤流。(5)publicvoidprintStackTrace(PrintStreams)把該Throwable和它的跟蹤情況打印到指定打印流。(6)publicvoidprintStackTrace(PrintWriters)把該Throwable和它的跟蹤情況打印到指定打印流。(7)publicStringtoString()返回該throwable對象的簡短字符串描述。8.2.3Throwable類的常用方法(3)pub19第8章Java異常處理8.1什么是異常8.2異常處理機制8.3異常的處理8.4創(chuàng)建用戶異常類第8章Java異常處理8.1什么是異常208.3異常的處理8.3.1捕獲異常try-catch-finally8.3.2聲明拋棄異常8.3.3拋出異常8.3異常的處理8.3.1捕獲異常try-catch-f218.3.1捕獲異常try-catch-finally
一個方法中如果對某種類型的異常對象提供了相應(yīng)的處理代碼,則這個方法可捕獲該種異常。捕獲異常是通過try-catch-finally語句實現(xiàn)的。其語法為:try{
......
}catch(ExceptionName1e){
......
}catch(ExceptionName2e){
......
}
......
}finally{
......
}
1、try捕獲異常的第一步是用try{…}選定捕獲異常的范圍,由try所限定的代碼塊中的語句在執(zhí)行過程中可能會生成異常對象并拋棄。8.3.1捕獲異常try-catch-finally228.3.1捕獲異常try-catch-finally
2、catch每個try代碼塊可以伴隨一個或多個catch語句,用于處理try代碼塊中所生成的異常事件。catch語句只需要一個形式參數(shù)來指明它所能夠捕獲的異常類型,這個類必須是Throwable的子類,運行時系統(tǒng)通過參數(shù)值把被拋棄的異常對象傳遞給catch塊。catch塊中的代碼用來對異常對象進行處理,與訪問其它對象一樣,可以訪問一個異常對象的變量或調(diào)用它的方法。getMessage()是類Throwable所提供的方法,用來得到有關(guān)異常事件的信息,類Throwable還提供了方法printStackTrace()用來跟蹤異常事件發(fā)生時執(zhí)行堆棧的內(nèi)容。例如:
try{
......
}catch(FileNotFoundExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(IOExceptione){
System.out.println(e);
}
8.3.1捕獲異常try-catch-finally2238.3.1捕獲異常try-catch-finally
3、catch語句的順序
捕獲異常的順序和catch語句的順序有關(guān),當(dāng)捕獲到一個異常時,剩下的catch語句就不再進行匹配。因此,在安排catch語句的順序時,首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。例如上面的程序如果安排成如下的形式:
try{
......
}catch(IOExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(FileNotFoundExceptione){
System.out.println(e);
}由于第一個catch語句首先得到匹配,第二個catch語句將不會被執(zhí)行。編譯時將出現(xiàn)“catchnotreached”的錯誤。8.3.1捕獲異常try-catch-finally3248.3.1捕獲異常try-catch-finally
4、finally捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。一般是用來關(guān)閉文件或釋放其他的系統(tǒng)資源。雖然finally作為try-catch-finally結(jié)構(gòu)的一部分,但在程序是可選的,也就是說可以沒有finally語句。如果存在finally語句,不論try塊中是否發(fā)生了異常,是否執(zhí)行過catch語句,都要執(zhí)行finally語句。另外,try-catch-finally可以嵌套。8.3.1捕獲異常try-catch-finally4258.3.2聲明拋棄異常
如果在一個方法中生成了一個異常,但是這一方法并不確切地知道該如何對這一異常事件進行處理,這時,該方法就應(yīng)該聲明拋棄異常,使得異常對象可以從調(diào)用棧向后傳播,直到有合適的方法捕獲它為止。
聲明拋棄異常是在一個方法聲明中的throws子句中指明的。例如:
publicintread()throwsIOException{
……}throws子句中同時可以指明多個異常,之間由逗號隔開。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException{……}最后,我們再次強調(diào),對于非運行時例外,如前例中的IOException等,程序中必須要作出處理,或者捕獲,或者聲明拋棄。而對于運行時例外,如前例中的ArithmeticException,IndexOutOfBoundsException,則可以不做處理。8.3.2聲明拋棄異常如果在一個方法中生成了一個異常,268.3.2聲明拋棄異常
【例8-4】拋棄異常的例子(對例8-1進行改進)//Exception4.javaimportjava.io.*;publicclassException4{publicstaticvoidmain(Stringargs[])throwsFileNotFoundException,IOException{FileInputStreamfis=newFileInputStream(“text.txt”);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}8.3.2聲明拋棄異常【例8-4】拋棄異常的例子(對例278.3.2聲明拋棄異常
【例8-5】捕獲異常的例子(對例8-1進行改進)importjava.io.*;publicclassException5{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream(“text.txt”);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}catch(FileNotFoundExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(IOExceptione){
System.out.println(e);
}}}8.3.2聲明拋棄異常【例8-5】捕獲異常的例子(對例288.3.3拋出異常拋出異常就是產(chǎn)生異常對象的過程,首先要生成異常對象,異常或者由虛擬機生成,或者由某些類的實例生成,也可以在程序中生成。在方法中,拋出異常對象是通過throw語句實現(xiàn)的。例如:IOExceptione=newIOException();
throwe;可以拋出的異常必須是Throwable或其子類的實例。下面的語句在編譯時將會產(chǎn)生語法錯誤:thrownewString("throwanything");自定義異常類必須是Throwable的直接或間接子類。
8.3.3拋出異常拋出異常就是產(chǎn)生異常對象的過程,298.3.3拋出異?!纠?-6】顯示拋出異常詳細情況的例子//Exception6.javapublic
class
Exception6
{
public
static
void
main(String[]
args)
{
try
{
throw
new
Exception("My
Exception");
}
catch
(Exception
e)
{
System.err.println("Caught
Exception");
System.err.println("getMessage():"
+
e.getMessage());
System.err.println("getLocalizedMessage():"
+
e.getLocalizedMessage());
System.err.println("toString():"
+
e);
System.err.println("printStackTrace():");
e.printStackTrace();
}
}
}
8.3.3拋出異常【例8-6】顯示拋出異常詳細情況的例子308.3.3拋出異常程序運行結(jié)果如下:d:\user\chap08>javaException6CaughtExceptiongetMessage():MyExceptiongetLocalizedMessage():MyExceptiontoString():java.lang.Exception:MyExceptionprintStackTrace():java.lang.Exception:MyException atException6.main(Exception6.java:5)
8.3.3拋出異常程序運行結(jié)果如下:318.3.3拋出異常
例8-7】try-catch-finally嵌套的例子classMyoneExceptionextendsException{}publicclassTryInbed{publicstaticvoidmain(String[]args){System.out.println("Enteringfirsttryblock");
try{System.out.println("Enteringsecondtryblock");
try{thrownewMyoneException();}finally{System.out.println("finallyin2ndtryblock");}//try-catch-finally嵌套在try限定的范圍內(nèi)。}catch(MyoneExceptione){System.err.println("CaughtMyoneExceptionin1sttryblock");}finally{System.err.println("finallyin1sttryblock");}}}8.3.3拋出異常例8-7】try-catch-fin328.3.3拋出異常
程序運行結(jié)果如下:EnteringfirsttryblockEnteringsecondtryblockfinallyin2ndtryblockCaughtMyoneExceptionin1sttryblockfinallyin1sttryblock8.3.3拋出異常程序運行結(jié)果如下:33第8章Java異常處理8.1什么是異常8.2異常處理機制8.3異常的處理8.4創(chuàng)建用戶異常類第8章Java異常處理8.1什么是異常348.4創(chuàng)建用戶異常類
如果Java提供的系統(tǒng)異常類型不能滿足程序設(shè)計的需求,我們可以設(shè)計自己的異常類型。從Java異常類的結(jié)構(gòu)層次可以看出,Java異常的公共父類為Throwable。在程序運行中可能出現(xiàn)兩種問題:一種是由硬件系統(tǒng)或JVM導(dǎo)致的故障,Java定義該故障為Error。這類問題用戶程序不能夠處理的。另外一種問題是程序運行錯誤,Java定義為Exception。這種情況下,可以通過程序設(shè)計的調(diào)整來實現(xiàn)異常處理。因此,用戶定義的異常類型必須是Throwable的直接或間接子類。Java推薦用戶的異常類型以Exception為直接父類。創(chuàng)建用戶異常的方法如下:classUserExceptionextendsException{UserException(){super();……//其它語句}}8.4創(chuàng)建用戶異常類如果Java提供的系統(tǒng)異常類358.4創(chuàng)建用戶異常類
我們在使用異常時,有以下幾點建議需要注意:(1)對于運行時例外,如果不能預(yù)測它何時發(fā)生,程序可以不做處理,而是讓Java虛機去處理它。(2)如果程序可以預(yù)知運行時例外可能發(fā)生的地點和時間,則應(yīng)該在程序中進行處理,而不應(yīng)簡單地把它交給運行時系統(tǒng)。
(3)在自定義異常類時,如果它所對應(yīng)的異常事件通??偸窃谶\行時產(chǎn)生的,而且不容易預(yù)測它將在何時、何處發(fā)生,則可以把它定義為運行時例外,否則應(yīng)定義為非運行時例外。8.4創(chuàng)建用戶異常類我們在使用異常時,有以下幾點建議368.4創(chuàng)建用戶異常類
。【例8-8】用戶定義的異常類的使用//Exception8.javaclassMyotherExceptionextendsException{//用戶定義的異常publicMyotherException(){}publicMyotherException(Stringmsg){super(msg);}}8.4創(chuàng)建用戶異常類?!纠?-8】用戶定義的異常類378.4創(chuàng)建用戶異常類publicclassException8{publicstaticvoidf()throwsMyotherException{System.out.println("ThrowingMyotherExceptionfromf()");thrownewMyotherException();}publicstaticvoidg()throwsMyotherException{System.out.println("ThrowingMyotherExceptionfromg()");thrownewMyotherException("Originateding()");}publicstaticvoidmain(String[]args){try{f();}catch(MyotherExceptione){e.printStackTrace();}try{g();}catch(MyotherExceptione){e.printStackTrace();}}}8.4創(chuàng)建用戶異常類publicclassExcep388.4創(chuàng)建用戶異常類程序的運行結(jié)果如下:ThrowingMyotherExceptionfromf()ThrowingMyotherExceptionfromg()MyotherException atException8.f(Exception8.java:13) atException8.main(Exception8.java:21)MyotherException:Originateding() atException8.g(Exception8.java:17) atException8.main(Exception8.java:26)8.4創(chuàng)建用戶異常類程序的運行結(jié)果如下:39《Java程序設(shè)計》《Java程序設(shè)計》40第8章Java異常處理8.1什么是異常8.2異常處理機制8.3異常的處理8.4創(chuàng)建用戶異常類第8章Java異常處理8.1什么是異常418.1什么是異常異常(Exception)也叫例外。在Java編程語言中,異常就是程序在運行過程中由于硬件設(shè)備問題、軟件設(shè)計錯誤、缺陷等導(dǎo)致的程序錯誤。在軟件開發(fā)過程中,很多情況都將導(dǎo)致異常的產(chǎn)生,例如:(1)想打開的文件不存在;(2)網(wǎng)絡(luò)連接中斷;(3)操作數(shù)超出預(yù)定范圍;(4)正在裝載的類文件丟失;(5)訪問的數(shù)據(jù)庫打不開;可見,在程序中產(chǎn)生異常的現(xiàn)象是非常普遍的。在Java編程語言中,對異常的處理有非常完備的機制。異常本身作為一個對象,產(chǎn)生異常就是產(chǎn)生一個異常對象。這個對象可能由應(yīng)用程序本身產(chǎn)生,也可能由Java虛擬機產(chǎn)生,這取決于產(chǎn)生異常的類型。該異常對象中包括了異常事件的類型以及發(fā)生異常時應(yīng)用程序目前的狀態(tài)和調(diào)用過程。請看下面產(chǎn)生異常的例子。8.1什么是異常異常(Exception)也叫例外。在Ja428.1什么是異常【例8-1】文件操作將產(chǎn)生異常//Exception1.javaimportjava.io.*;classException1{publicstaticvoidmain(Stringargs[]){FileInputStreamfis=newFileInputStream("text.txt");intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}8.1什么是異常【例8-1】文件操作將產(chǎn)生異常438.1什么是異常當(dāng)編譯這個程序時,屏幕上會輸出下面的信息:D:\user\chap08>javacException1.javaException1.java:5:unreportedexceptionjava.io.FileNotFoundException;mustbecaughtordeclaredtobethrownFileInputStreamfis=newFileInputStream("text.txt");^Exception1.java:7:unreportedexceptionjava.io.IOException;mustbecaughtordeclaredtobethrownwhile((b=fis.read())!=-1){^Exception1.java:10:unreportedexceptionjava.io.IOException;mustbecaughtordeclaredtobethrownfis.close();^3errors8.1什么是異常當(dāng)編譯這個程序時,屏幕上會輸出下面的信息:448.1什么是異?!纠?-2】數(shù)組下標(biāo)超界的例子//Exception2.javapublicclassException2{publicstaticvoidmain(Stringargs[]){Stringlangs[]={"Java","VisaulBasic","C++"};inti=0;while(i<4){System.out.println(langs[i]);i++;}}}
8.1什么是異常【例8-2】數(shù)組下標(biāo)超界的例子458.1什么是異常程序的編譯和運行結(jié)果如下:D:\user\chap08>javacException2.javaD:\user\chap08>javaException2JavaVisaulBasicC++Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3atException2.main(Exception2.java:8)上面的例子編譯可以通過,但運行時出現(xiàn)異常信息被拋出。在其循環(huán)被執(zhí)行四次之后,數(shù)組下標(biāo)溢出,程序終止,并帶有錯誤信息,就象前面所示的程序那樣。8.1什么是異常程序的編譯和運行結(jié)果如下:468.1什么是異常【例8-3】被0除的例子//Exception3.javaclassException3{publicstaticvoidmain(Stringargs[]){inta=0;System.out.println(5/a);}}我們編譯這個程序得到其字節(jié)碼文件,然后運行它,屏幕上的顯示如下:D:\user\chap08>javacException3.javaD:\user\chap08>javaException3Exceptioninthread"main"java.lang.ArithmeticException:/byzeroatException3.main(Exception3.java:5)因為除數(shù)不能為0,所以在程序運行的時候出現(xiàn)了除以0溢出的異常事件。8.1什么是異?!纠?-3】被0除的例子478.1什么是異常在上面的三個例子中,我們都遇到了異常。屏幕上所顯示的信息java.io.IOException、java.io.FileNotFoundException、java.lang.ArrayIndexOutOfBoundsException以及java.lang.ArithmeticException分別指明了異常的類型以及異常所在的包。同時我們也可以看到,對于某些異常,在程序中必須對它進行處理,否則編譯程序會指出錯誤(如例8-1)。但對另一些異常,在程序中可以不做處理,而直接由運行時系統(tǒng)來處理(如例8-3)。在下節(jié)中,我們將詳細了解這兩類異常,以及在程序中如何處理這兩類異常。
8.1什么是異常在上面的三個例子中,我們都遇48第8章Java異常處理8.1什么是異常8.2異常處理機制8.3異常的處理8.4創(chuàng)建用戶異常類第8章Java異常處理8.1什么是異常498.2異常處理機制8.2.1Java的異常處理機制8.2.2異常類的類層次8.2.3Throwable類的常用方法8.2異常處理機制8.2.1Java的異常處理機制508.2.1Java的異常處理機制
在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會生成一個異常對象。這個對象可能是由正在運行的方法生成,也可能由Java虛擬機生成,其中包含一些信息指明異常事件的類型以及當(dāng)異常發(fā)生時程序的運行狀態(tài)等。Java語言提供兩種處理異常的機制:(1)捕獲異常在Java程序運行過程中系統(tǒng)得到一個異常對象時,它將會沿著方法的調(diào)用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型異常的方法后,運行時系統(tǒng)把當(dāng)前異常對象交給這個方法進行處理,這一過程稱為捕獲(catch)異常。這是一種積極的異常處理機制。如果Java運行時系統(tǒng)找不到可以捕獲異常的方法,則運行時系統(tǒng)將終止,相應(yīng)的Java程序也將退出。(2)聲明拋棄異常當(dāng)Java程序運行時系統(tǒng)得到一個異常對象時,如果一個方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時,聲明拋棄(throws)異常。8.2.1Java的異常處理機制在J518.2.2異常類的類層次前面已經(jīng)提到,Java是采用面向?qū)ο蟮姆椒▉硖幚礤e誤的,一個異常事件是由一個異常對象來代表的。這些異常對象都對應(yīng)于類java.lang.Throwable及其子類。下面我們就來看一下異常類的層次。在java類庫的每個包中都定義了自己的異常類,所有這些類都直接或間接地繼承于類Throwable。圖8-1列舉了一些異常類并指明了它們的繼承關(guān)系。從圖8-1可以看出,Java中的異常事件分為兩大類。一類繼承于類Error,它的繼承關(guān)系如下:java.lang.Objectjava.lang.Throwablejava.lang.Error常見的錯誤類有AnnotationFormatError,AssertionError,AWTError,LinkageError,CoderMalfunctionError,FactoryConfigurationError,ThreadDeath,VirtualMachineError,TransformerFactoryConfigurationError等,包括動態(tài)鏈接失敗、線程死鎖、圖形界面錯誤、虛擬機錯誤等,通常Java程序不應(yīng)該捕獲這類異常,也不會拋棄這種異常。
8.2.2異常類的類層次前面已經(jīng)提到528.2.2異常類的類層次另外一類異常則繼承于類Exception,這是Java程序中所大量處理的異常。它的繼承關(guān)系如下:java.lang.Objectjava.lang.Throwablejava.lang.Exception常見的異常類有:AclNotFoundException,ApplicationException,AWTException,BackingStoreException,ClassNotFoundException,CloneNotSupportedException,DataFormatException,DestroyFailedException,ExecutionException,PrintException,GeneralSecurityException,InterruptedException,InvalidPreferencesFormatException,ParseException,RuntimeException,SAXException,SQLException,TimeoutException,TransformerException,UnsupportedCallbackException,UnsupportedLookAndFeelException,URISyntaxException,UserException,XAException,XMLParseException,XPathException
等其中包括了運行時異常和非運行時異常。
8.2.2異常類的類層次另外一類異常則繼承于類Except538.2.2異常類的類層次
8.2.2異常類的類層次548.2.2異常類的類層次
常見的運行時異常如下:(1)類型轉(zhuǎn)換異常ClassCastExceptionStringstrName=newstring(“123”);intnNumber=(int)strName;(2)數(shù)組超界異常ArrayIndexOutBoundsExceptionint[]b=newint[10];b[10]=1000;(3)指定數(shù)組維數(shù)為負值異常NegativeArraySizeExceptionb[-1]=1001;(4)算術(shù)異常ArithmeticExceptionintb=0;a=500/b;(5)Java系統(tǒng)內(nèi)部異常InternalExceptionJVM拋出的異常。(6)類型不符合異常IncompatibleTypeExceptionintn=12345;Strings=(String)n;(7)內(nèi)存溢出異常OutOfMemeoryException(8)沒有找到類定義異常NoClassDefFoundExceptionaClassaa=newaClas();//但aClass類未定義。(9)空指針異常NullPointerExceptionintb[];b[0]=99;//沒有實例化,就訪問,將產(chǎn)生空指針。8.2.2異常類的類層次常見的運行時異常如下:(4)558.2.2異常類的類層次
常見的非運行時異常如下:(1)ClassNotFoundException:找不到類或接口所產(chǎn)生的異常(2)CloneNotSupportedException:使用對象的clone方法但無法執(zhí)行Cloneable所產(chǎn)生的異常。(3)IllegalAccessException:類定義不明確所產(chǎn)生的異常。例如:類不為public,或是包含一個類定義在另一個類庫內(nèi)。(4)IOException:在一般情況下不能完成I/O操作所產(chǎn)生的異常。(5)EOFException:打開文件沒有數(shù)據(jù)可以讀取所產(chǎn)生的異常(6)FileNotFoundException:在文件系統(tǒng)中,找不到文件名稱或路徑所產(chǎn)生(7)InterruptedIOException:目前線程等待執(zhí)行,另一線程中斷目前線程I/O運行所產(chǎn)生的異常在Sun公司提供的各種API包中,如java.io,,java.awt等,都提供不同情況下可能產(chǎn)生的異常。由于異常的種類非常多,需要讀者實際運用中逐漸掌握。
8.2.2異常類的類層次常見的非運行時異常如下:568.2.3Throwable類的常用方法
java.lng.Throwable類是所有Error類和Exception類的父類,常用的方法有fillInStackTrace()、getLocalizedMessage()、getMessage()、printStackTrace()、printStackTrace(PrintStream)、printStackTrace(PrintWriter)、toString()。(1)publicnativeThrowablefillInStackTrace()填寫執(zhí)行堆棧跟蹤信息。該方法在應(yīng)用程序重新拋出錯誤或異常時有用。例如:try{a=b/c;}catch(ArithmeticThrowablee){a=Number.MAX_VALUE;throwe.fillInStackTrace();}(2)publicStringgetLocalizedMessage()生成該Throwable的本地化描述。子類可能會覆蓋該方法以便產(chǎn)生一個特定于本地的消息。對于未覆蓋該方法的子類,缺省地返回調(diào)用getMessage()的結(jié)果。8.2.3Throwable類的常用方法java.ln578.2.3Throwable類的常用方法
(3)publicStringgetMessage()返回該throwable對象的詳細信息。如果該對象沒有詳細信息則返回null。(4)publicvoidprintStackTrace()把該Throwable和它的跟蹤情況打印到標(biāo)準(zhǔn)錯誤流。(5)publicvoidprintStackTrace(PrintStreams)把該Throwable和它的跟蹤情況打印到指定打印流。(6)publicvoidprintStackTrace(PrintWriters)把該Throwable和它的跟蹤情況打印到指定打印流。(7)publicStringtoString()返回該throwable對象的簡短字符串描述。8.2.3Throwable類的常用方法(3)pub58第8章Java異常處理8.1什么是異常8.2異常處理機制8.3異常的處理8.4創(chuàng)建用戶異常類第8章Java異常處理8.1什么是異常598.3異常的處理8.3.1捕獲異常try-catch-finally8.3.2聲明拋棄異常8.3.3拋出異常8.3異常的處理8.3.1捕獲異常try-catch-f608.3.1捕獲異常try-catch-finally
一個方法中如果對某種類型的異常對象提供了相應(yīng)的處理代碼,則這個方法可捕獲該種異常。捕獲異常是通過try-catch-finally語句實現(xiàn)的。其語法為:try{
......
}catch(ExceptionName1e){
......
}catch(ExceptionName2e){
......
}
......
}finally{
......
}
1、try捕獲異常的第一步是用try{…}選定捕獲異常的范圍,由try所限定的代碼塊中的語句在執(zhí)行過程中可能會生成異常對象并拋棄。8.3.1捕獲異常try-catch-finally618.3.1捕獲異常try-catch-finally
2、catch每個try代碼塊可以伴隨一個或多個catch語句,用于處理try代碼塊中所生成的異常事件。catch語句只需要一個形式參數(shù)來指明它所能夠捕獲的異常類型,這個類必須是Throwable的子類,運行時系統(tǒng)通過參數(shù)值把被拋棄的異常對象傳遞給catch塊。catch塊中的代碼用來對異常對象進行處理,與訪問其它對象一樣,可以訪問一個異常對象的變量或調(diào)用它的方法。getMessage()是類Throwable所提供的方法,用來得到有關(guān)異常事件的信息,類Throwable還提供了方法printStackTrace()用來跟蹤異常事件發(fā)生時執(zhí)行堆棧的內(nèi)容。例如:
try{
......
}catch(FileNotFoundExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(IOExceptione){
System.out.println(e);
}
8.3.1捕獲異常try-catch-finally2628.3.1捕獲異常try-catch-finally
3、catch語句的順序
捕獲異常的順序和catch語句的順序有關(guān),當(dāng)捕獲到一個異常時,剩下的catch語句就不再進行匹配。因此,在安排catch語句的順序時,首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。例如上面的程序如果安排成如下的形式:
try{
......
}catch(IOExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(FileNotFoundExceptione){
System.out.println(e);
}由于第一個catch語句首先得到匹配,第二個catch語句將不會被執(zhí)行。編譯時將出現(xiàn)“catchnotreached”的錯誤。8.3.1捕獲異常try-catch-finally3638.3.1捕獲異常try-catch-finally
4、finally捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。一般是用來關(guān)閉文件或釋放其他的系統(tǒng)資源。雖然finally作為try-catch-finally結(jié)構(gòu)的一部分,但在程序是可選的,也就是說可以沒有finally語句。如果存在finally語句,不論try塊中是否發(fā)生了異常,是否執(zhí)行過catch語句,都要執(zhí)行finally語句。另外,try-catch-finally可以嵌套。8.3.1捕獲異常try-catch-finally4648.3.2聲明拋棄異常
如果在一個方法中生成了一個異常,但是這一方法并不確切地知道該如何對這一異常事件進行處理,這時,該方法就應(yīng)該聲明拋棄異常,使得異常對象可以從調(diào)用棧向后傳播,直到有合適的方法捕獲它為止。
聲明拋棄異常是在一個方法聲明中的throws子句中指明的。例如:
publicintread()throwsIOException{
……}throws子句中同時可以指明多個異常,之間由逗號隔開。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException{……}最后,我們再次強調(diào),對于非運行時例外,如前例中的IOException等,程序中必須要作出處理,或者捕獲,或者聲明拋棄。而對于運行時例外,如前例中的ArithmeticException,IndexOutOfBoundsException,則可以不做處理。8.3.2聲明拋棄異常如果在一個方法中生成了一個異常,658.3.2聲明拋棄異常
【例8-4】拋棄異常的例子(對例8-1進行改進)//Exception4.javaimportjava.io.*;publicclassException4{publicstaticvoidmain(Stringargs[])throwsFileNotFoundException,IOException{FileInputStreamfis=newFileInputStream(“text.txt”);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}8.3.2聲明拋棄異?!纠?-4】拋棄異常的例子(對例668.3.2聲明拋棄異常
【例8-5】捕獲異常的例子(對例8-1進行改進)importjava.io.*;publicclassException5{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream(“text.txt”);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}catch(FileNotFoundExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(IOExceptione){
System.out.println(e);
}}}8.3.2聲明拋棄異常【例8-5】捕獲異常的例子(對例678.3.3拋出異常拋出異常就是產(chǎn)生異常對象的過程,首先要生成異常對象,異常或者由虛擬機生成,或者由某些類的實例生成,也可以在程序中生成。在方法中,拋出異常對象是通過throw語句實現(xiàn)的。例如:IOExceptione=newIOException();
throwe;可以拋出的異常必須是Throwable或其子類的實例。下面的語句在編譯時將會產(chǎn)生語法錯誤:thrownewString("throwanything");自定義異常類必須是Throwable的直接或間接子類。
8.3.3拋出異常拋出異常就是產(chǎn)生異常對象的過程,688.3.3拋出異常【例8-6】顯示拋出異常詳細情況的例子//Exception6.javapublic
class
Exception6
{
public
static
void
main(String[]
args)
{
try
{
throw
new
Exception("My
Exception");
}
catch
(Exception
e)
{
System.err.println("Caught
Exception");
System.err.println("getMessage():"
+
e.getMessage());
System.err.println("getLocalizedMessage():"
+
e.getLocalizedMessage());
System.err.println("toString():"
+
e);
System.err.println("printStackTrace():");
e.printStackTrace();
}
}
}
8.3.3拋出異常【例8-6】顯示拋出異常詳細情況的例子698.3.3拋出異常程序運行結(jié)果如下:d:\user\chap08>javaException6CaughtExceptiongetMessage():MyExceptiongetLocalizedMessage():MyExceptiontoString():java.lang.Exception:MyExceptionprintStackTrace():java.lang.Exception:MyException atException6
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小課題申報書范例
- 課題申報研究計劃書模板
- 課題申報書查重
- 課題項目申報書怎么找
- 中醫(yī)護理課題申報書范文
- 課題申報書的撰寫及案例
- 決策咨詢課題申報書
- 合同范例去買
- 別墅商用租賃合同范本
- 語文課題的申報書
- 國際學(xué)校六年級數(shù)學(xué)測(英文)
- 黑河對俄邊境旅游的發(fā)展現(xiàn)狀及對策研究
- 《馬克思主義與社會科學(xué)方法論》課后思考題答案全
- 為人民服務(wù) 公開課比賽一等獎
- 2023年山東省春季高考語文試題詳解
- 休閑農(nóng)業(yè)與鄉(xiāng)村旅游(課件)
- 設(shè)備安裝驗收單
- YY/T 1712-2021采用機器人技術(shù)的輔助手術(shù)設(shè)備和輔助手術(shù)系統(tǒng)
- 高中語文部編版(2023)選擇性必修中冊第三單元9屈原列傳 屈原列傳(解析版)
- GB/T 31366-2015光伏發(fā)電站監(jiān)控系統(tǒng)技術(shù)要求
- 管理制度-汽修廠環(huán)境保護管理制度參考范本
評論
0/150
提交評論