第7章異常處理PPT課件_第1頁(yè)
第7章異常處理PPT課件_第2頁(yè)
第7章異常處理PPT課件_第3頁(yè)
第7章異常處理PPT課件_第4頁(yè)
第7章異常處理PPT課件_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第7章 異常處理異?;A(chǔ)異常基礎(chǔ) 異常是指程序在運(yùn)行時(shí)發(fā)生的錯(cuò)誤。通過異常處理機(jī)制,我們可以用一種結(jié)構(gòu)化的可控方式來處理運(yùn)行時(shí)地錯(cuò)誤。盡管大多數(shù)高級(jí)程序設(shè)計(jì)語言都提供了一些異常處理機(jī)制,但是Java中的異常處理機(jī)制比其它語言提供的更簡(jiǎn)潔、更靈活。在Java中,所有的異常都用類來表示。所有的異常類都是從java.lang包中的Throwable類繼承而來的。 ErrorError和和ExceptionException 1.Error Error用來表示編譯和運(yùn)行錯(cuò)誤,如程序進(jìn)入了死循環(huán)、內(nèi)存溢出等。Error只能在編譯階段解決,運(yùn)行時(shí)程序本身無法解決,只能依靠其它程序的干預(yù),否則會(huì)一直處于非正

2、常狀態(tài)。Error處理一般由系統(tǒng)承擔(dān),Java本身不提供相應(yīng)的Error處理機(jī)制。2.Exception Exception用來表示由程序活動(dòng)所導(dǎo)致的錯(cuò)誤,如運(yùn)算時(shí)除數(shù)為0、打開一個(gè)文件時(shí)發(fā)現(xiàn)文件不存在等。當(dāng)程序運(yùn)行出現(xiàn)Exception時(shí),在程序中加入異常處理代碼,仍可使程序繼續(xù)運(yùn)行直至程序結(jié)束。 異常處理機(jī)制正是針對(duì)Exception類的ThrowableThrowable的方法的方法 Throwable中定義了多個(gè)方法。因?yàn)樗械漠惓n惗际荰hrowable的子類,所以它們都繼承了Throwable的這些方法。 Throwable fillInStackTrace():返回一個(gè)包含調(diào)用棧

3、信息的Throwable對(duì)象,該對(duì)象可以被重新拋出。 void printStackTrace():將調(diào)用棧信息輸出到標(biāo)準(zhǔn)錯(cuò)誤 。 String geiMessage():返回對(duì)異常的描述。 String getLocalizedMessage():返回對(duì)異常的本地描述。 String toString():返回一個(gè)包含異常描述的String對(duì)象。 異常的產(chǎn)生異常的產(chǎn)生 Java中的異常處理機(jī)制看似十分的繁瑣,實(shí)際使用時(shí)卻并不復(fù)雜。下面介紹一個(gè)簡(jiǎn)單的基本異常:class Throw1 public static void main(String args) int a=new int4; Sy

4、stem.out.println(Before exception!); a8=12; /產(chǎn)生一個(gè)數(shù)組下標(biāo)越界異常 System.out.println(After exception!); 輸出結(jié)果: Followed by exception! Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 8 at Throw1.main(Throw1.java:5) 上例中產(chǎn)生了一個(gè)數(shù)組下標(biāo)越界異常,它是RuntimeException的一個(gè)子類,它是Java中的一個(gè)基本異常,要想對(duì)各種異常類有個(gè)全面的了解,需要去查

5、看Java的JDK Documentation。 我們可以看到,異常產(chǎn)生之后程序終止了執(zhí)行,并且輸出了相應(yīng)的異常信息。此例中產(chǎn)生的異常有Java虛擬機(jī)自動(dòng)拋出。 捕獲和處理異常捕獲和處理異常 程序發(fā)生異常時(shí),會(huì)生成一個(gè)異常對(duì)象,這個(gè)異常對(duì)象會(huì)在方法內(nèi)部被拋出,它假設(shè)異常將被異常處理程序捕獲。如果程序不捕獲異常,它就要被JVM捕獲,這個(gè)方法將在拋出異常的過程中結(jié)束。要是不希望方法就此結(jié)束,可以在方法內(nèi)部設(shè)置一個(gè)特殊的塊來監(jiān)視可能產(chǎn)生異常的代碼,然后讓程序來捕獲并處理異常對(duì)象從而不會(huì)影響其他語句的執(zhí)行。在Java中,提供了try和catch語句來捕獲和處理一個(gè)或多個(gè)異常。語法格式如下: try /

6、 可能產(chǎn)生異常的代碼 catch(Type1 e) / 對(duì)異常類型Type1的異常處理代碼 . 其中,try塊是一段可能產(chǎn)生異常的代碼,也被叫做“監(jiān)控區(qū)域”;catch語句的參數(shù)類似于方法的聲明,包括一個(gè)異常類型和一個(gè)異常對(duì)象。異常類型必須為Throwable類的子類,它指明了catch語句所處理的異常類型,異常對(duì)象則在try塊中產(chǎn)生;大括號(hào)中是異常處理程序,其中可以調(diào)用對(duì)象的方法。與一個(gè)try相關(guān)的catch語句可以有一個(gè)或多個(gè),異常的類型決定了要執(zhí)行哪個(gè)catch語句。也就是說,如果由一個(gè)catch語句指定的異常類型與發(fā)生的異常類型相符,那么就會(huì)執(zhí)行這個(gè)catch語句,其他的catch語句

7、則被跳過。 例如:class Try1 public static void main(String args) int a=new int4; try System.out.println(Before exception!); a8=12; System.out.println(After exception); catch(ArrayIndexOutOfBoundsException e) System.out.println(ArrayIndexOutOfBoundsException caught!); catch(ArithmeticException e) System.out.

8、println(ArithmeticException caught!); System.out.println(End up!); 輸出結(jié)果: Before exception! ArrayIndexOutOfBoundsException caught! End up! 運(yùn)行結(jié)果中可以看出,上例try塊中產(chǎn)生了一個(gè)數(shù)組下標(biāo)越界異常,這個(gè)異常對(duì)象被第一個(gè)catch語句捕獲并處理,第二個(gè)catch語句則被直接跳過,緊接著執(zhí)行了catch語句后面的輸出語句。 如果try塊中沒有拋出異常,那么try塊就會(huì)全部執(zhí)行結(jié)束,并且會(huì)跳過它的所有catch語句,從最后一個(gè)catch后面的第一個(gè)語句繼續(xù)執(zhí)行。

9、例如:class Try2 public static void main(String args) int a=new int4; try a0=12; System.out.println(No!); catch(ArrayIndexOutOfBoundsException e) System.out.println(ArrayIndexOutOfBoundsException caught!); System.out.println(End up!); 輸出結(jié)果: Will exception be generated? No! End up! try代碼塊中可能會(huì)拋出一個(gè)或多個(gè)異常。我

10、們要針對(duì)每個(gè)可能發(fā)生的異常,準(zhǔn)備相應(yīng)的異常處理程序。例如:class Try3 public static void main(String args) int a=6,7,16,25,43,48,55,76; int b=3,0,4,5,0,8; for(int i=0;ia.length;i+) try System.out.println(ai+/+bi+is+ai/bi); catch(ArithmeticException e) System.out.println(Cant divide by zero!); catch(ArrayIndexOutOfBoundsException

11、 e) System.out.println(No matching element found!); 輸出結(jié)果: 6/3 is 2 Cant divide by zero! 16/4 is 4 25/5 is 5 Cant divide by zero! 48/8 is 6 No matching element found! No matching element found!捕獲所有異常捕獲所有異常 當(dāng)拋出異常的時(shí)候,Java會(huì)從上向下分別對(duì)每個(gè)catch語句處理的異常類型進(jìn)行檢測(cè),然后按照代碼的書寫順序找出“最近”的處理程序。找到匹配的處理程序之后,它便認(rèn)為異常將得到處理,然后就不在繼

12、續(xù)查找。查找的時(shí)候并不要求拋出的異常同處理程序所聲名的異常完全匹配。派生類的對(duì)象也可以匹配其基類的處理程序。例如: class Try4 public static void main(String args) int a=6,7,16,25,43,48,55,76; int b=3,0,4,5,0,8; for(int i=0;ia.length;i+) try System.out.println(ai+/+bi+is+ai/bi); catch(ArrayIndexOutOfBoundsException e) System.out.println(No natching element

13、 found!); catch(RuntimeException e) System.out.println(Some exception generated!); 輸出結(jié)果: 6/3 is 2 Some exception generated! 16/4 is 4 25/5 is 5 Some exception generated! 48/8 is 6 No natching element found! No natching element found! 從運(yùn)行結(jié)果中我們可以看到,數(shù)組下標(biāo)越界異常被第一個(gè)catch語句捕獲并處理,而算術(shù)異常卻被RuntimeException類型的ca

14、tch語句所捕獲,這是因?yàn)锳rithmeticException是RuntimeException的子類。因此,如果你既想捕獲超類異常,又想捕獲子類異常,那么就應(yīng)該把子類的catch語句放在catch語句序列的前面。 很顯然,我們也可以用一個(gè)catch語句處理多個(gè)異常類型,這時(shí)它的異常類型參數(shù)應(yīng)該是這些異常類型的超類。在實(shí)際情況下,我們通常不能完全確定拋出異常的類型,為了保證程序的順利運(yùn)行,我們需要捕獲所有可能類型的異常。通過捕獲異常類型的基類Exception就可以做到這一點(diǎn): catch (Exception e) / 拋出異常拋出異常 我們可以通過throw語句手動(dòng)拋出異常。其基本語法格

15、式如下: throw Obj; 其中throw是關(guān)鍵字,Obj是創(chuàng)建的異常類型的對(duì)象。在throw語句中同樣是使用new創(chuàng)建異常類型的對(duì)象。例如:class Throw2 public static void main(String args) try System.out.println(Before throw!); throw new ArithmeticException(); catch(ArithmeticException e) System.out.println(ArithmeticException caught!); System.out.println(End up!)

16、; 輸出結(jié)果: Before throw! ArithmeticException caught! End up!重新拋出異常重新拋出異常 由catch語句捕獲的異??梢灾匦聮伋鲆允雇獠縞atch語句可以捕獲它。重新拋出的主要原因是為了允許多個(gè)異常處理程序訪問異常。重拋異常會(huì)把異常拋給上一級(jí)環(huán)境中的異常處理程序,高一級(jí)環(huán)境中捕獲此異常的處理程序可以從這個(gè)異常對(duì)象中得到所有信息。 class UseRethrow public static void t() try System.out.println(Bofore exception!); throw new ArithmeticExcept

17、ion(); catch(ArithmeticException e) System.out.println(ArithmeticException caught!); throw e; class RethrowDemo public static void main(String args) try UseRethrow.t(); catch(ArithmeticException e) System.out.println(Caught again!); 輸出結(jié)果: Before exception! ArithmeticException caught! Caught again! A

18、rrayIndexOutOfBoundsException在方法t()中被重新拋出,又在main()中被再次捕獲。 finally finally 對(duì)于一些代碼,可能會(huì)希望無論try塊中的異常是否被拋出,它們都能得到執(zhí)行。為了在退出try/catch代碼塊時(shí)指定一個(gè)要執(zhí)行的代碼塊,可以在異常處理程序后面加上finally子句。包含finally的try/catch的基本形式如下所示:try / 可能產(chǎn)生異常的代碼catch(Type1 e) / 對(duì)異常類型Type1的異常處理代碼Finally / 退出try/catch代碼塊后要執(zhí)行的代碼 class Usefinally2 public s

19、tatic void t() int a=new int4; try System.out.println(Before exception!); a8=10; catch(ArrayIndexOutOfBoundsException e) System.out.println(ArrayIndexOutOfBoundsException caught!); throw e; finally System.out.println(In finally clause!); class FinallyDemo2 public static void main(String args) try Us

20、efinally2.t(); catch(ArrayIndexOutOfBoundsException e) System.out.println(Caught again!); 輸出結(jié)果: Before exception! ArrayIndexOutOfBoundsException caught! In finally clause! Caught again! 上例中內(nèi)層try塊拋出了異常,finally塊中的語句得到了執(zhí)行。再將程序修改一下。將程序中的這一行“a8=10;”改為“a1=10;”,此時(shí)沒有異常拋出,運(yùn)行結(jié)果如下: Before exception! In finally

21、 clause! 可見無論是出于何種原因,只要離開try/catch代碼塊,就會(huì)執(zhí)行finally代碼塊。異常說明異常說明 在某些情況下,如果一個(gè)方法產(chǎn)生自己不處理的異常,它就必須在throws子句中聲名該異常,這就是異常說明,它屬于方法聲名的一部分,緊跟在形式參數(shù)列表之后。包含throws子句的方法的基本形式如下: returnType methodname(/*argument list*/) throwsexceptionList /method body 此處,exceptionList是一個(gè)方法可能會(huì)拋出的異常的列表,各個(gè)異常之間用逗號(hào)隔開。 凡是RuntimeException及其子類的異常都不必在列表中指定。它們被稱為“未被檢查的異?!薄F渌愋彤惓5奶幚矶际怯删幾g器強(qiáng)制實(shí)施的。這種異常被稱為“被檢查的異?!?。 class ThrowsDemo public static void t() throws Exception System.o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論