[高等教育]第5講 異常ppt課件_第1頁
[高等教育]第5講 異常ppt課件_第2頁
[高等教育]第5講 異常ppt課件_第3頁
[高等教育]第5講 異常ppt課件_第4頁
[高等教育]第5講 異常ppt課件_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、主要目的:主要目的:1.1.了解異常的產(chǎn)生原理了解異常的產(chǎn)生原理2.2.掌握異常處置語句的根本格式掌握異常處置語句的根本格式3.3.掌握掌握throwthrow和和throwsthrows關(guān)鍵字的作用關(guān)鍵字的作用4.4.自定義異常自定義異常5.5.了解了解ExceptionException和和RuntimeExceptionRuntimeException的區(qū)別的區(qū)別6.6.了解斷言的作用了解斷言的作用n異常異常-?n運(yùn)轉(zhuǎn)時(shí)錯(cuò)誤運(yùn)轉(zhuǎn)時(shí)錯(cuò)誤n編譯時(shí)錯(cuò)誤編譯時(shí)錯(cuò)誤n異常是導(dǎo)致程序中斷運(yùn)轉(zhuǎn)的一種指令流異常是導(dǎo)致程序中斷運(yùn)轉(zhuǎn)的一種指令流,假設(shè)不對異常進(jìn)展正確處置,那么能,假設(shè)不對異常進(jìn)展正確處置,那

2、么能夠?qū)е鲁绦虻闹袛鄨?zhí)行,呵斥不用要的夠?qū)е鲁绦虻闹袛鄨?zhí)行,呵斥不用要的損失。損失。nJava中異常都是以類和對象的方式存在中異常都是以類和對象的方式存在的。的。 常見的運(yùn)轉(zhuǎn)時(shí)異常如下:常見的運(yùn)轉(zhuǎn)時(shí)異常如下:(1) 類型轉(zhuǎn)換異常類型轉(zhuǎn)換異常ClassCastExceptionString strName=new string(“123);int nNumber=(int)strName; (2) 數(shù)組超界異常數(shù)組超界異常ArrayIndexOutBoundsExceptionint b=new int10;b10=1000;(3) 指定數(shù)組維數(shù)為負(fù)值異常指定數(shù)組維數(shù)為負(fù)值異常NegativeA

3、rraySizeExceptionb-1=1001;(4) 算術(shù)異常ArithmeticExceptionint b=0;a=500/b;(5) Java系統(tǒng)內(nèi)部異常InternalExceptionJVM拋出的異常。(6) 類型不符合異常IncompatibleTypeExceptionint n=12345;String s=(String)n; (7) 內(nèi)存溢出異常OutOfMemeoryException(8) 沒有找到類定義異常NoClassDefFoundExceptionaClass aa=new aClas(); /但aClass類未定義。(9) 空指針異常 NullPoint

4、erExceptionint b ;b0=99; /沒有實(shí)例化,就訪問,將產(chǎn)生空指針。 常見的非運(yùn)轉(zhuǎn)時(shí)異常如下:(1) ClassNotFoundException :找不到類或接口所產(chǎn)生的異常(2) CloneNotSupportedException:運(yùn)用對象的 clone 方法但無法執(zhí)行 Cloneable 所產(chǎn)生的異常(3) IllegalAccessException :類定義不明確所產(chǎn)生的異常。例如:類不為 public ,或是包含一個(gè)類定義在另一個(gè)類庫內(nèi)(4) IOException :在普通情況下不能完成I/O操作所產(chǎn)生的異常(5) EOFException: 翻開文件沒有數(shù)據(jù)

5、可以讀取所產(chǎn)生的異常(6) FileNotFoundException :在文件系統(tǒng)中,找不到文件稱號或途徑所產(chǎn)生(7) InterruptedIOException:目前線程等待執(zhí)行,另一線程中斷目前線程I/O運(yùn)轉(zhuǎn)所產(chǎn)生的異常 在Sun公司提供的各種API包中,如java.io, , java.awt等,都提供不同情況下能夠產(chǎn)生的異常。由于異常的種類非常多,需求讀者實(shí)踐運(yùn)用中逐漸掌握。 java.lng.Throwable類是一切Error類和Exception類的父類,常用的方法有 fillInStackTrace() 、getLocalizedMessage() 、getMessage(

6、) 、printStackTrace()、printStackTrace(PrintStream) 、 printStackTrace(PrintWriter) 、toString()。(1) public native Throwable fillInStackTrace()填寫執(zhí)行堆棧跟蹤信息。 該方法在運(yùn)用程序重新拋出錯(cuò)誤或異常時(shí)有用。例如: try a = b / c; catch(ArithmeticThrowable e) a = Number.MAX_VALUE; throw e.fillInStackTrace(); (2) public String getLocalized

7、Message()生成該 Throwable 的本地化描畫。 子類能夠會覆蓋該方法以便產(chǎn)生一個(gè)特定于本地的音訊。 對于未覆蓋該方法的子類,缺省地前往調(diào)用 getMessage() 的結(jié)果。 (3) public String getMessage()前往該 throwable 對象的詳細(xì)信息。假設(shè)該對象沒有詳細(xì)信息那么前往null。 (4) public void printStackTrace()把該 Throwable 和它的跟蹤情況打印到規(guī)范錯(cuò)誤流。(5) public void printStackTrace(PrintStream s)把該 Throwable 和它的跟蹤情況打印到指

8、定打印流。 (6) public void printStackTrace(PrintWriter s)把該 Throwable 和它的跟蹤情況打印到指定打印流。(7) public String toString()前往該 throwable 對象的簡短字符串描畫。 在Java程序的執(zhí)行過程中,假設(shè)出現(xiàn)了異常事件,就會生成一個(gè)異常對象。這個(gè)對象能夠是由正在運(yùn)轉(zhuǎn)的方法生成,也能夠由Java虛擬機(jī)生成,其中包含一些信息指明異常事件的類型以及當(dāng)異常發(fā)生時(shí)程序的運(yùn)轉(zhuǎn)形狀等。 Java言語提供兩種處置異常的機(jī)制: 1捕獲異常 在Java程序運(yùn)轉(zhuǎn)過程中系統(tǒng)得到一個(gè)異常對象時(shí),它將會沿著方法的調(diào)用棧逐層回

9、溯,尋覓處置這一異常的代碼。找到可以處置這種類型異常的方法后,運(yùn)轉(zhuǎn)時(shí)系統(tǒng)把當(dāng)前異常對象交給這個(gè)方法進(jìn)展處置,這一過程稱為捕獲(catch)異常。這是一種積極的異常處置機(jī)制。假設(shè)Java運(yùn)轉(zhuǎn)時(shí)系統(tǒng)找不到可以捕獲異常的方法,那么運(yùn)轉(zhuǎn)時(shí)系統(tǒng)將終止,相應(yīng)的Java程序也將退出。 2聲明拋出異常當(dāng)Java程序運(yùn)轉(zhuǎn)時(shí)系統(tǒng)得到一個(gè)異常對象時(shí),假設(shè)一個(gè)方法并不知道如何處置所出現(xiàn)的異常,那么可在方法聲明時(shí),聲明拋出throws異常,但不需求作任何處置。 一個(gè)方法中假設(shè)對某種類型的異常對象提供了相應(yīng)的處置代碼,那么這一個(gè)方法中假設(shè)對某種類型的異常對象提供了相應(yīng)的處置代碼,那么這個(gè)方法可捕獲該種異常。捕獲異常是經(jīng)過

10、個(gè)方法可捕獲該種異常。捕獲異常是經(jīng)過try-catch-finally語句實(shí)現(xiàn)的。其語句實(shí)現(xiàn)的。其語法為:語法為:try .catch( ExceptionName1 e ). catch( ExceptionName2 e ).finally.1、try捕獲異常的第一步是用捕獲異常的第一步是用try選定捕獲異常的范圍,由選定捕獲異常的范圍,由try所限定的代碼塊所限定的代碼塊中的語句在執(zhí)行過程中能夠會生成異常對象并丟棄。中的語句在執(zhí)行過程中能夠會生成異常對象并丟棄。 2、catch每個(gè)每個(gè)try代碼塊可以伴隨一個(gè)或多個(gè)代碼塊可以伴隨一個(gè)或多個(gè)catch語句,用于處置語句,用于處置try代碼塊

11、中所生代碼塊中所生成的異常事件。成的異常事件。catch語句只需求一個(gè)方式參數(shù)來指明它所可以捕獲的異常語句只需求一個(gè)方式參數(shù)來指明它所可以捕獲的異常類型類型,這個(gè)類必需是這個(gè)類必需是Throwable的子類的子類,運(yùn)轉(zhuǎn)時(shí)系統(tǒng)經(jīng)過參數(shù)值把被丟棄的異運(yùn)轉(zhuǎn)時(shí)系統(tǒng)經(jīng)過參數(shù)值把被丟棄的異常對象傳送給常對象傳送給catch塊。塊。catch塊中的代碼用來對異常對象進(jìn)展處置,與訪問其它對象一樣,可以訪塊中的代碼用來對異常對象進(jìn)展處置,與訪問其它對象一樣,可以訪問一個(gè)異常對象的變量或調(diào)用它的方法。問一個(gè)異常對象的變量或調(diào)用它的方法。getMessage( )是類是類Throwable所提供的方法,用來得到有關(guān)

12、異常事件的信息,類所提供的方法,用來得到有關(guān)異常事件的信息,類Throwable還提供了方法還提供了方法printStackTrace( )用來跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。例如:用來跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。例如: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 );

13、3、catch 語句的順序語句的順序捕獲異常的順序和捕獲異常的順序和catch語句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下語句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下的的catch語句就不再進(jìn)展匹配。因此,在安排語句就不再進(jìn)展匹配。因此,在安排catch語句的順序時(shí),首先應(yīng)語句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸普通化。也就是普通先安排子類,再安排該捕獲最特殊的異常,然后再逐漸普通化。也就是普通先安排子類,再安排父類。例如上面的程序假設(shè)安排成如下的方式:父類。例如上面的程序假設(shè)安排成如下的方式:try.catch(IOException e )System.out.println( e );

14、System.out.println( message: +e.getMessage() );e.printStackTrace( System.out );catch(FileNotFoundException e )System.out.println( e );由于第一個(gè)由于第一個(gè)catch語句首先得到匹配,第二個(gè)語句首先得到匹配,第二個(gè)catch語句將不會被執(zhí)行。編語句將不會被執(zhí)行。編譯時(shí)將出現(xiàn)譯時(shí)將出現(xiàn)“catch not reached的錯(cuò)誤。的錯(cuò)誤。 4、finally捕獲異常的最后一步是經(jīng)過捕獲異常的最后一步是經(jīng)過finally語句為異常處置提供一個(gè)一致的出口,使語句為異常處置

15、提供一個(gè)一致的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,可以對程序的形狀作一致的管理。普得在控制流轉(zhuǎn)到程序的其它部分以前,可以對程序的形狀作一致的管理。普通是用來封鎖文件或釋放其他的系統(tǒng)資源。雖然通是用來封鎖文件或釋放其他的系統(tǒng)資源。雖然finally作為作為try-catch-finally構(gòu)造的一部分,但在程序是可選的,也就是說可以沒有構(gòu)造的一部分,但在程序是可選的,也就是說可以沒有 finally語句。語句。假設(shè)存在假設(shè)存在finally語句,不論語句,不論try塊中能否發(fā)生了異常,能否執(zhí)行過塊中能否發(fā)生了異常,能否執(zhí)行過catch 語語句,都要執(zhí)行句,都要執(zhí)行finally語句。語句。

16、另外,另外,try-catch-finally可以嵌套。可以嵌套。 假設(shè)在一個(gè)方法中生成了一個(gè)異常,但是這一方法并不確切地知道該如何對這一異常事件進(jìn)展處置,這時(shí),該方法就應(yīng)該聲明拋出異常,使得異常對象可以從調(diào)用棧向后傳播,直到有適宜的方法捕獲它為止。聲明丟棄異常是在一個(gè)方法聲明中的throws子句中指明的。例如:public int read () throws IOException throws子句中同時(shí)可以指明多個(gè)異常,之間由逗號隔開。例如: public static void main(String args) throws IOException,IndexOutOfBoundsE

17、xception 最后,我們再次強(qiáng)調(diào),對于非運(yùn)轉(zhuǎn)時(shí)異常,如前例中的IOException等,程序中必需求作出處置,或者捕獲,或者聲明丟棄。而對于運(yùn)轉(zhuǎn)時(shí)異常,如前例中的ArithmeticException,IndexOutOfBoundsException,那么可以不做處置。 【例【例5-4】拋出異常的例子對例】拋出異常的例子對例8-1進(jìn)展改良進(jìn)展改良/ Exception4.javaimport java.io.*;public class Exception4public static void main(String args)throws FileNotFoundException,I

18、OException FileInputStream fis=new FileInputStream(“text.txt); int b; while(b=fis.read()!=-1) System.out.print(b); fis.close(); 【例【例5-5】捕獲異常的例子對例】捕獲異常的例子對例8-1進(jìn)展改良進(jìn)展改良import java.io.*;public class Exception5public static void main(String args) try FileInputStream fis=new FileInputStream(“text.txt); i

19、nt b; while(b=fis.read()!=-1) System.out.print(b); fis.close();catch(FileNotFoundException e) System.out.println( e ); System.out.println( message: +e.getMessage() ); e.printStackTrace( System.out ); catch(IOException e) System.out.println( e ); 自動拋出異常就是產(chǎn)生異常對象的過程,首先要生成異常對象,異?;蛘哂商摂M機(jī)生成,或者由某些類的實(shí)例生成,也可以

20、在程序中生成。在方法中,拋出異常對象是經(jīng)過throw語句實(shí)現(xiàn)的。例如: IOException e=new IOException();throw e ;可以拋出的異常必需是Throwable或其子類的實(shí)例。下面的語句在編譯時(shí)將會產(chǎn)生語法錯(cuò)誤: throw new String(throw anything); 自定義異常類必需是Throwable的直接或間接子類。 【例【例5-6】顯示自動拋出異常詳細(xì)情況的例子】顯示自動拋出異常詳細(xì)情況的例子/Exception6.javapublic class Exception6 public static void main(String args)

21、 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.pri

22、ntStackTrace(); 程序運(yùn)轉(zhuǎn)結(jié)果如下:d:userchap08java Exception6Caught ExceptiongetMessage():My ExceptiongetLocalizedMessage():My ExceptiontoString():java.lang.Exception: My ExceptionprintStackTrace():java.lang.Exception: My Exceptionat Exception6.main(Exception6.java:5) 例例5-7】try-catch-finally嵌套的例子嵌套的例子class M

23、yoneException extends Exception public class TryInbed public static void main(String args) System.out.println(Entering first try block); try System.out.println(Entering second try block); try throw new MyoneException(); finally System.out.println(finally in 2nd try block); /try-catch-finally嵌套在嵌套在tr

24、y限定的范圍內(nèi)。限定的范圍內(nèi)。 catch (MyoneException e) System.err.println(Caught MyoneException in 1st try block); finally System.err.println(finally in 1st try block); 程序運(yùn)轉(zhuǎn)結(jié)果如下:Entering first try blockEntering second try blockfinally in 2nd try blockCaught MyoneException in 1st try blockfinally in 1st try block

25、假設(shè) Java 提供的系統(tǒng)異常類型不能滿足程序設(shè)計(jì)的需求,我們可以設(shè)計(jì)本人的異常類型。從 Java 異常類的構(gòu)造層次可以看出,Java 異常的公共父類為 Throwable 。在程序運(yùn)轉(zhuǎn)中能夠出現(xiàn)兩種問題:一種是由硬件系統(tǒng)或JVM導(dǎo)致的缺點(diǎn), Java 定義該缺點(diǎn)為 Error 。這類問題用戶程序不可以處置的。另外一種問題是程序運(yùn)轉(zhuǎn)錯(cuò)誤,Java 定義為 Exception。這種情況下,可以經(jīng)過程序設(shè)計(jì)的調(diào)整來實(shí)現(xiàn)異常處置。因此,用戶定義的異常類型必需是 Throwable 的直接或間接子類。Java 引薦用戶的異常類型以 Exception 為直接父類。創(chuàng)建用戶異常的方法如下: class UserException extends Exception UserException()

溫馨提示

  • 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

提交評論