![Java程序開發(fā)教學課件:08-異常_第1頁](http://file4.renrendoc.com/view/8ee83a4265c7e923f0906615bbba9dca/8ee83a4265c7e923f0906615bbba9dca1.gif)
![Java程序開發(fā)教學課件:08-異常_第2頁](http://file4.renrendoc.com/view/8ee83a4265c7e923f0906615bbba9dca/8ee83a4265c7e923f0906615bbba9dca2.gif)
![Java程序開發(fā)教學課件:08-異常_第3頁](http://file4.renrendoc.com/view/8ee83a4265c7e923f0906615bbba9dca/8ee83a4265c7e923f0906615bbba9dca3.gif)
![Java程序開發(fā)教學課件:08-異常_第4頁](http://file4.renrendoc.com/view/8ee83a4265c7e923f0906615bbba9dca/8ee83a4265c7e923f0906615bbba9dca4.gif)
![Java程序開發(fā)教學課件:08-異常_第5頁](http://file4.renrendoc.com/view/8ee83a4265c7e923f0906615bbba9dca/8ee83a4265c7e923f0906615bbba9dca5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java程序設計
——異常處理重慶大學計算機學院
Java的異常處理1什么是異常2異常處理機制3異常的處理4創(chuàng)建用戶異常類1什么是異常異常(Exception)也叫例外。在Java編程語言中,異常就是程序在運行過程中由于硬件設備問題、軟件設計錯誤、缺陷等導致的程序錯誤。在軟件開發(fā)過程中,很多情況都將導致異常的產(chǎn)生,例如:(1)想打開的文件不存在;(2)網(wǎng)絡連接中斷;(3)操作數(shù)超出預定范圍;(4)正在裝載的類文件丟失;(5)訪問的數(shù)據(jù)庫打不開;1什么是異??梢?,在程序中產(chǎn)生異常的現(xiàn)象是非常普遍的。在Java編程語言中,對異常的處理有非常完備的機制。異常本身作為一個對象,產(chǎn)生異常就是產(chǎn)生一個異常對象。這個對象可能由應用程序本身產(chǎn)生,也可能由Java虛擬機產(chǎn)生,這取決于產(chǎn)生異常的類型。該異常對象中包括了異常事件的類型以及發(fā)生異常時應用程序目前的狀態(tài)和調用過程。請看下面產(chǎn)生異常的例子。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();}}1什么是異常當編譯這個程序時,屏幕上會輸出下面的信息: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();
^3errors1什么是異?!纠?】數(shù)組下標超界的例子//Exception2.javapublicclassException2{publicstaticvoidmain(Stringargs[]){Stringlangs[]={"Java","VisaulBasic","C++"};inti=0;while(i<4){System.out.println(langs[i]);i++;}}}1什么是異常程序的編譯和運行結果如下:D:\user\chap08>javacException2.javaD:\user\chap08>javaException2JavaVisaulBasicC++Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3atException2.main(Exception2.java:8)這個的例子編譯可以通過,但運行時出現(xiàn)異常信息被拋出。在其循環(huán)被執(zhí)行四次之后,數(shù)組下標溢出,程序終止,并帶有錯誤信息,就象前面所示的程序那樣。1什么是異常【例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溢出的異常事件。1什么是異常
在上面的三個例子中,我們都遇到了異常。屏幕上所顯示的信息java.io.IOException、java.io.FileNotFoundException、java.lang.ArrayIndexOutOfBoundsException
以及java.lang.ArithmeticException
1什么是異常
分別指明了異常的類型以及異常所在的包。同時我們也可以看到,對于某些異常,在程序中必須對它進行處理,否則編譯程序會指出錯誤(如例1)。但對另一些異常,在程序中可以不做處理,而直接由運行時系統(tǒng)來處理(如例3)。在下節(jié)中,我們將詳細了解這兩類異常,以及在程序中如何處理這兩類異常。
Java異常處理1什么是異常2異常處理機制3異常的處理4創(chuàng)建用戶異常類2異常處理機制2.1Java的異常處理機制2.2異常類的類層次2.3Throwable類的常用方法2.1Java的異常處理機制
在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會生成一個異常對象。這個對象可能是由正在運行的方法生成,也可能由Java虛擬機生成,其中包含一些信息指明異常事件的類型以及當異常發(fā)生時程序的運行狀態(tài)等。Java語言提供兩種處理異常的機制:
(1)捕獲異常
在Java程序運行過程中系統(tǒng)得到一個異常對象時,它將會沿著方法的調用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型異常的方法后,運行時系統(tǒng)把當前異常對象交給這個方法進行處理,這一過程稱為捕獲(catch)異常。這是一種積極的異常處理機制。如果Java運行時系統(tǒng)找不到可以捕獲異常的方法,則運行時系統(tǒng)將終止,相應的Java程序也將退出。
2.1Java的異常處理機制(2)聲明拋棄異常當Java程序運行時系統(tǒng)得到一個異常對象時,如果一個方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時,聲明拋棄(throws)異常。2.2異常類的類層次
前面已經(jīng)提到,Java是采用面向對象的方法來處理錯誤的,一個異常事件是由一個異常對象來代表的。這些異常對象都對應于類java.lang.Throwable及其子類。下面我們就來看一下異常類的層次。
在java類庫的每個包中都定義了自己的異常類,所有這些類都直接或間接地繼承于類Throwable。下圖列舉了一些異常類并指明了它們的繼承關系。
2.2異常類的類層次
從上圖可以看出,Java中的異常事件分為兩大類。一類繼承于類Error,它的繼承關系如下:java.lang.Objectjava.lang.Throwablejava.lang.Error
常見的錯誤類有AnnotationFormatError,AssertionError,AWTError,LinkageError,CoderMalfunctionError,FactoryConfigurationError,ThreadDeath,VirtualMachineError,TransformerFactoryConfigurationError等,包括動態(tài)鏈接失敗、線程死鎖、圖形界面錯誤、虛擬機錯誤等,通常Java程序不應該捕獲這類異常,也不會拋棄這種異常。2.2異常類的類層次另外一類異常則繼承于類Exception,這是Java程序中所大量處理的異常。它的繼承關系如下:java.lang.Objectjava.lang.Throwablejava.lang.Exception常見的異常類有:AclNotFoundException,PrintException,GeneralSecurityException,InterruptedException,InvalidPreferencesFormatException,ParseException,RuntimeException,SAXException,SQLException,TimeoutException,TransformerException,UnsupportedCallbackException,UnsupportedLookAndFeelException,URISyntaxException,UserException,XAException,XMLParseException,XPathException
等
其中包括了運行時異常和非運行時異常。
異常體系結構所有異常類型都是內置類Throwable的子類用于Java運行時系統(tǒng)來顯示與運行時系統(tǒng)本身有關的錯誤用于用戶程序可能捕獲的異常,也是用來創(chuàng)建用戶異常類型子類的類。Error類對象由Java虛擬機生成并拋出;Exception類對象由應用程序處理或拋出。2.2異常類的類層次
2.2異常類的類層次
常見的運行時異常如下:(1)類型轉換異常ClassCastExceptionStringstrName=newstring(“123”);intnNumber=(int)strName;(2)數(shù)組超界異常ArrayIndexOutBoundsExceptionint[]b=newint[10];b[10]=1000;(3)指定數(shù)組維數(shù)為負值異常NegativeArraySizeExceptionb[-1]=1001;(4)算術異常ArithmeticExceptionintb=0;a=500/b;(5)Java系統(tǒng)內部異常InternalExceptionJVM拋出的異常。(6)類型不符合異常IncompatibleTypeExceptionintn=12345;Strings=(String)n;(7)內存溢出異常OutOfMemeoryException(8)沒有找到類定義異常NoClassDefFoundExceptionaClassaa=newaClas();//但aClass類未定義。(9)空指針異常NullPointerExceptionintb[];b[0]=99;//沒有實例化,就訪問,將產(chǎn)生空指針。2.2異常類的類層次
常見的非運行時異常如下:(1)ClassNotFoundException:找不到類或接口所產(chǎn)生的異常(2)CloneNotSupportedException:使用對象的clone方法但無法執(zhí)行Cloneable所產(chǎn)生的異常。(3)IllegalAccessException:類定義不明確所產(chǎn)生的異常。例如:類不為public,或是包含一個類定義在另一個類庫內。(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)生的異常。由于異常的種類非常多,需要讀者實際運用中逐漸掌握。
2.3Throwable類的常用方法
java.lng.Throwable類是所有Error類和Exception類的父類,常用的方法有fillInStackTrace()、getLocalizedMessage()、getMessage()、printStackTrace()、printStackTrace(PrintStream)、printStackTrace(PrintWriter)、toString()。(1)publicnativeThrowablefillInStackTrace()填寫執(zhí)行堆棧跟蹤信息。
該方法在應用程序重新拋出錯誤或異常時有用。例如:
try{a=b/c;}catch(ArithmeticExceptione){a=Integer.MAX_VALUE;throwe.fillInStackTrace();}(2)publicStringgetLocalizedMessage()生成該Throwable的本地化描述。
子類可能會覆蓋該方法以便產(chǎn)生一個特定于本地的消息。
對于未覆蓋該方法的子類,缺省地返回調用getMessage()的結果。
2.3Throwable類的常用方法
(3)publicStringgetMessage()返回該throwable對象的詳細信息。如果該對象沒有詳細信息則返回null。
(4)publicvoidprintStackTrace()把該Throwable和它的跟蹤情況打印到標準錯誤流。(5)publicvoidprintStackTrace(PrintStreams)把該Throwable和它的跟蹤情況打印到指定打印流。
(6)publicvoidprintStackTrace(PrintWriters)把該Throwable和它的跟蹤情況打印到指定打印流。(7)publicStringtoString()返回該throwable對象的簡短字符串描述。
Java異常處理1什么是異常2異常處理機制3異常的處理4創(chuàng)建用戶異常類3異常的處理3.1捕獲異常try-catch-finally3.2聲明拋棄異常3.3拋出異常3.1捕獲異常try-catch-finally
一個方法中如果對某種類型的異常對象提供了相應的處理代碼,則這個方法可捕獲該種異常。捕獲異常是通過try-catch-finally語句實現(xiàn)的。其語法為:try{
......
}catch(ExceptionName1e){
......
}catch(ExceptionName2e){
......
}
......
}finally{
......
}
1、try捕獲異常的第一步是用try{…}選定捕獲異常的范圍,由try所限定的代碼塊中的語句在執(zhí)行過程中可能會生成異常對象并拋棄。3.1捕獲異常try-catch-finally
2、catch原理每個try代碼塊可以伴隨一個或多個catch語句,用于處理try代碼塊中所生成的異常事件。catch語句只需要一個形式參數(shù)來指明它所能夠捕獲的異常類型,這個類必須是Throwable的子類,運行時系統(tǒng)通過參數(shù)值把被拋棄的異常對象傳遞給catch塊。catch塊中的代碼用來對異常對象進行處理,與訪問其它對象一樣,可以訪問一個異常對象的變量或調用它的方法。getMessage()是類Throwable所提供的方法,用來得到有關異常事件的信息,類Throwable還提供了方法printStackTrace()用來跟蹤異常事件發(fā)生時執(zhí)行堆棧的內容。例如:
3.1捕獲異常try-catch-finallytry{
......
}catch(FileNotFoundExceptione){
System.out.println(e);
System.out.println(“message:”+e.getMessage());
e.printStackTrace(System.out);
}catch(IOExceptione){
System.out.println(e);
}
3.1捕獲異常try-catch-finally
3、catch語句的順序
捕獲異常的順序和catch語句的順序有關,當捕獲到一個異常時,剩下的catch語句就不再進行匹配。因此,在安排catch語句的順序時,首先應該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。例如上面的程序如果安排成如下的形式:
try{
......
}catch(IOExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(FileNotFoundExceptione){
System.out.println(e);
}3.1捕獲異常try-catch-finally
由于第一個catch語句首先得到匹配,第二個catch語句將不會被執(zhí)行。編譯時將出現(xiàn)“catchnotreached”的錯誤。
4、finally捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口,使得在控制流轉到程序的其它部分以前,能夠對程序的狀態(tài)作統(tǒng)一的管理。一般是用來關閉文件或釋放其他的系統(tǒng)資源。雖然finally作為try-catch-finally結構的一部分,但在程序是可選的,也就是說可以沒有finally語句。如果存在finally語句,不論try塊中是否發(fā)生了異常,是否執(zhí)行過catch語句,都要執(zhí)行finally語句。另外,try-catch-finally可以嵌套。3.2聲明拋棄異常
如果在一個方法中生成了一個異常,但是這一方法并不確切地知道該如何對這一異常事件進行處理,這時,該方法就應該聲明拋棄異常,使得異常對象可以從調用棧向后傳播,直到有合適的方法捕獲它為止。
聲明拋棄異常是在一個方法聲明中的throws子句中指明的。例如:
publicintread()throwsIOException{……}throws子句中同時可以指明多個異常,之間由逗號隔開。例如:
publicstaticvoidmain(Stringargs[])throws
IOException,IndexOutOfBoundsException{……}
最后,我們再次強調,對于非運行時例外,如前例中的IOException等,程序中必須要作出處理,或者捕獲,或者聲明拋棄。而對于運行時例外,如前例中的ArithmeticException,IndexOutOfBoundsException,則可以不做處理。3.2聲明拋棄異常
【例4】拋棄異常的例子(對例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();}}3.2聲明拋棄異常
【例5】捕獲異常的例子(對例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);
}}}3.3拋出異常
拋出異常就是產(chǎn)生異常對象的過程,首先要生成異常對象,異?;蛘哂商摂M機生成,或者由某些類的實例生成,也可以在程序中生成。在方法中,拋出異常對象是通過throw語句實現(xiàn)的。例如:IOExceptione=newIOException();
throwe;可以拋出的異常必須是Throwable或其子類的實例。下面的語句在編譯時將會產(chǎn)生語法錯誤:thrownewString("throwanything");
自定義異常類必須是Throwable的直接或間接子類。
3.3拋出異?!纠?】顯示拋出異常詳細情況的例子//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();
}
}
}
3.3拋出異常程序運行結果如下:d:\user\chap08>javaException6CaughtExceptiongetMessage():MyExceptiongetLocalizedMessage():MyExceptiontoString():java.lang.Exception:MyExceptionprintStackTrace():java.lang.Exception:MyException atException6.main(Exception6.java:5)
Java異常處理1什么是異常2異常處理機制3異常的處理4創(chuàng)建用戶異常類4創(chuàng)建用戶異常類
如果Java提供的系統(tǒng)異常類型不能滿足程序設計的需求,我們可以設計自己的異常類型。從Java異常類的結構層次可以看出,Java異常的公共父類為Throwable。在程序運行中可能出現(xiàn)兩種問題:一種是由硬件系統(tǒng)或JVM導致的故障,Java定義該故障為Error。這類問題用戶程序不能夠處理的。另外一種問題是程序運行錯誤,Java定義為Exception。這種情況下,可以通過程序設計的調整來實現(xiàn)異常處理。因此,用戶定義的異常類型必須是Throwable的直接或間接子類。Java推薦用戶的異常類型以Exception為直接父類。創(chuàng)建用戶異常的方法如下:
4創(chuàng)建用戶異常類
classUserExceptionextendsException{UserException(){super();
……//其它語句}}我們在使用異常時,有以下幾點建議需要注意:(1)對于運行時例外,如果不能預測它何時發(fā)生,程序可以不做處理,而是讓Java虛機去處理它。(2)如果程序可以預知運行時例外可能發(fā)生的地點和時間,則應該在程序中進行處理,而不應簡單地把它交給運行時系統(tǒng)。
(3)在自定義異常類時,如果它所對應的異常事件通??偸窃谶\行時產(chǎn)生的,而且不容易預測它將在何時、何處發(fā)生,則可以把它定義為運行時例外,否則應定義為非運行時例外。4創(chuàng)建用戶異常類
。【例7】用戶定義的異常類的使用//Exception8.javaclassMyotherExceptionextendsException{//用戶定義的異常publicMyotherException(){}publicMyotherException(Stringmsg){super(msg);}}4創(chuàng)建用戶異常類publicclassException8{publicstaticvoidf()throwsMyotherException{System.out.println("ThrowingMyotherExceptionfromf()");thrownewMyotherException();}publicstaticvoidg()throwsMyotherException{System.out.println("ThrowingMyotherExceptionfromg()");thrownewMyotherException("Originateding()");}
4創(chuàng)建用戶異常類publicstaticvoidmain(String[]args){try{f();}catch(MyotherExceptione){e.printStackTrace();}try{g();}catch(MyotherExceptione){e.printStackTrace();}}}4創(chuàng)建用戶異常類程序的運行結果如下:ThrowingMyotherExceptionfromf()ThrowingMyotherExcepti
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023八年級歷史上冊 第五單元 從國共合作到國共對立第17課 中國工農(nóng)紅軍長征說課稿 新人教版
- 3 歡歡喜喜慶國慶(說課稿)-2024-2025學年統(tǒng)編版道德與法治二年級上冊
- Module 3 Unit 1 What are you doing?(說課稿)-2024-2025學年外研版(三起)英語四年級上冊
- 11《趙州橋》說課稿-2023-2024學年統(tǒng)編版語文三年級下冊
- 1學會尊重(說課稿)-2023-2024學年道德與法治六年級下冊統(tǒng)編版001
- Unit 3 Festivals and Customs Extended reading 說課稿-2024-2025學年高中英語譯林版(2020)必修第二冊
- 2023九年級物理下冊 專題六 材料、信息和能源B 能源學說課稿 (新版)新人教版
- 2023二年級數(shù)學下冊 六 田園小衛(wèi)士-萬以內的加減法(二)我學會了嗎說課稿 青島版六三制
- 2024-2025學年高中化學 專題五 電化學問題研究 5.1 原電池說課稿 蘇教版選修6
- 《10 身邊的新聞調查》(說課稿)-2023-2024學年三年級上冊綜合實踐活動吉美版
- 建筑裝飾工程計量與計價試題一及答案
- 簡易勞務合同電子版
- 明代文學緒論
- 通用稅務自查情況說明報告(7篇)
- 體育賽事的策劃、組織與實施 體育賽事利益相關者
- 分析化學(高職)PPT完整版全套教學課件
- 晚熟的人(莫言諾獎后首部作品)
- m拱頂儲罐設計計算書
- 2023外貿業(yè)務協(xié)調期中試卷
- 新人教鄂教版(2017)五年級下冊科學全冊教學課件
- GB/T 29361-2012電子物證文件一致性檢驗規(guī)程
評論
0/150
提交評論