工學(xué)第9章-異常處理new_第1頁(yè)
工學(xué)第9章-異常處理new_第2頁(yè)
工學(xué)第9章-異常處理new_第3頁(yè)
工學(xué)第9章-異常處理new_第4頁(yè)
工學(xué)第9章-異常處理new_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第九章異常處理重點(diǎn):

在編寫程序時(shí),要正確地使用捕獲異常和聲明拋棄異常的兩種異常處理的方法。

難點(diǎn):

如何使用Java中兩種異常處理機(jī)制,拋棄異常和聲明拋棄異常的區(qū)別與聯(lián)系。

難重點(diǎn)【教學(xué)目標(biāo)】

本講主要講述了java語(yǔ)言中獨(dú)特的異常處理機(jī)制,通過(guò)本講的學(xué)習(xí),同學(xué)們可以編寫更為完善的java程序?!倦y重點(diǎn)】

重點(diǎn):

在編寫程序時(shí),要正確地使用捕獲異常和聲明拋棄異常的兩種異常處理的方法。

難點(diǎn):

如何使用Java中兩種異常處理機(jī)制,拋棄異常和聲明拋棄異常的區(qū)別與聯(lián)系。【本講知識(shí)點(diǎn)】

1什么是異常

1.1異常示例

1.2異常處理機(jī)制

1.3異常類的層次

2異常的處理

2.1捕獲異常

2.2聲明拋棄異常

3自定義異常類的使用9.1異常處理機(jī)制

Java使用異常對(duì)程序給出一個(gè)統(tǒng)一和相對(duì)簡(jiǎn)單的拋出和處理錯(cuò)誤的機(jī)制。如果一個(gè)方法本身能拋出異常,調(diào)用者可以捕獲異常使之得到處理;也可以回避異常,這時(shí)異常將在調(diào)用的堆棧中向下傳遞,直到被處理。classExceptionDemo2{

publicstaticvoidmain(Stringargs[]){

inta=0;System.out.println(5/a);}

異常Java把程序運(yùn)算中可能遇到的錯(cuò)誤分為兩類:一類是非致命性的,通過(guò)某種修正后程序還能繼續(xù)執(zhí)行。這類錯(cuò)誤稱作異常。另一類是致命性的,即程序遇到了非常嚴(yán)重的不正常狀態(tài),不能簡(jiǎn)單地恢復(fù)執(zhí)行,這就是錯(cuò)誤。Java提供了異常處理機(jī)制,在Exception類中定義了程序產(chǎn)生異常的條件。對(duì)待異常通常并不是簡(jiǎn)單地結(jié)束程序,而是轉(zhuǎn)去執(zhí)行某段特殊代碼處理這個(gè)異常,設(shè)法恢復(fù)程序繼續(xù)執(zhí)行。Java實(shí)現(xiàn)了C++風(fēng)格的異常。當(dāng)程序中發(fā)生異常時(shí),稱程序產(chǎn)生了一個(gè)異常事件,相應(yīng)地生成異常對(duì)象。生成的異常對(duì)象傳遞給Java運(yùn)行時(shí)系統(tǒng)。異常產(chǎn)生和提交的這一過(guò)程稱為拋出。異常發(fā)生時(shí),Java運(yùn)行時(shí)系統(tǒng)從生成對(duì)象的代碼塊開(kāi)始,沿方法的調(diào)用棧逐層回溯,尋找相應(yīng)的處理代碼,并把異常對(duì)象交給該方法處理,這一過(guò)程稱為捕獲。所有的包中都定義了異常類和錯(cuò)誤類。Exception類是所有異常的父類,Exception類對(duì)象由應(yīng)用程序處理或拋出。Error類是所有錯(cuò)誤的父類,表示很難恢復(fù)的錯(cuò)誤,如內(nèi)存越界,一般不期望用戶程序來(lái)處理,即使程序員有能力處理這種錯(cuò)誤,也還是交給系統(tǒng)處理為好。Error類對(duì)象由Java虛擬機(jī)生成并拋出。

這兩個(gè)類同時(shí)又是Throwable的子類。異常和錯(cuò)誤類的層次結(jié)構(gòu)如圖所示:Java.lang.ThrowableJava.lang.ObjectJava.lang.errorJava.lang.exceptionErrors…Exceptions…

Exception子類的繼承關(guān)系ExceptionClassNotFoundExceptionClassNotSupportedExceptionIllegalAccessExceptionInstantiationExceptionInterruptedExceptionNoSuchMethodExceptionRuntimeExceptionArithmeticException:算術(shù)運(yùn)算產(chǎn)生的異常ArrayStoreException:存入數(shù)組的內(nèi)容數(shù)據(jù)類型不一致所產(chǎn)生ClassCastException:類對(duì)象強(qiáng)迫轉(zhuǎn)換造成不當(dāng)類對(duì)象所產(chǎn)生IllegalArgumentException:程序調(diào)用時(shí)返回錯(cuò)誤自變量的數(shù)據(jù)類型IllegalThreadStateExceptionNumberFormatExceptionException子類(續(xù))IllegalMonitorStateExceptionIndexOutOfBoundsException:索引超出范圍所產(chǎn)生ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionNegativeArraySizeException:負(fù)值索引所產(chǎn)生NullPointerException:對(duì)象引用參考值為null所產(chǎn)生SecurityException

:違反安全所產(chǎn)生的異常公共異常Java預(yù)定義了一些常見(jiàn)異常,最常用到的有如下幾個(gè)。(1)ArithmeticException

整數(shù)除法中,如果除數(shù)為0,則發(fā)生該類異常,如:

inti=12/0;(2)

NullPointerException

如果一個(gè)對(duì)象還沒(méi)有實(shí)例化,那么訪問(wèn)該對(duì)象或調(diào)用它的方法將導(dǎo)致NullPointerException異常如:

imageim[]=newimage[4]; System.out.println(im[0].toString())(3)NegativeArraySizeException

數(shù)組的元素個(gè)數(shù)應(yīng)是一個(gè)大于等于0的整數(shù)。創(chuàng)建數(shù)組時(shí),如果元素個(gè)數(shù)是個(gè)負(fù)數(shù),則會(huì)引發(fā)NegativeArraySizeException異常。(4)ArrayIndexOutOfBoundsExceptionJava

把數(shù)組看作是對(duì)象,并用length變量記錄數(shù)組的大小。訪問(wèn)數(shù)組元素時(shí),運(yùn)行時(shí)環(huán)境根據(jù)length值檢查下標(biāo)的大小。如果數(shù)組下標(biāo)越界,則將導(dǎo)致ArrayIndexOutOfBoundsException異常。(5)SecurityException

該類異常一般在瀏覽器內(nèi)拋出。若Applet試圖進(jìn)行下述操作,則由SecurityManager類拋出此異常:訪問(wèn)本地文件。打開(kāi)一個(gè)套接口,而不是返回到提供Applet的主機(jī)。在運(yùn)行時(shí)環(huán)境中運(yùn)行另一個(gè)程序。

除此之外,常見(jiàn)異常還有:

ArrayStoreException:程序試圖存取數(shù)組中錯(cuò)誤的數(shù)據(jù)類型。

FileNotFoundException:試圖存取一個(gè)并不存在的文件。

IOException:通常的I/O錯(cuò)誤。異常分類在Java中主要有三類異常。Java定義了類java.lang.Throwable,它是使用異常處理機(jī)制可被拋出并捕獲的所有異常對(duì)象的父類。它有三個(gè)基本子類異常分類ExceptionErrorRuntimeExceptionThrowableException類的主要方法publicException();publicException(Strings);publicStringtoString();publicStringgetMessage();異常示例publicclassHelloWorld

{ publicstaticvoidmain(Stringargs[]){

inti=0; Stringgreetings[]={"Helloworld!", "No,Imeanit!","HELLOWORLD!!" }; while(i<4){ System.out.println(greetings[i]); i++; } }}程序輸出如下所示:

javaHelloWorld

HelloWorld!No,Imeanit!HELLOWORLD!!java.lang.ArrayIndexOutOfBoundsExcepiton:3atHelloWorlds.main(HelloWorld.java:12)9.1Java異常處理機(jī)制9.2異常處理方式9.2異常處理方法

異常處理的方法有兩種:使用try…catch…finally結(jié)構(gòu)對(duì)異常進(jìn)行捕獲和處理;通過(guò)throws和throw拋出異常。

1try…catch…finally結(jié)構(gòu)在Java中,可以通過(guò)try…catch…finally結(jié)構(gòu)對(duì)異常進(jìn)行捕獲和處理,其形式如下:try{

可能出現(xiàn)異常的程序代碼}catch(異常類名1異常對(duì)象名1){異常類名1對(duì)應(yīng)的異常處理代碼}catch(異常類名2異常對(duì)象名2){異常類名2對(duì)應(yīng)的異常處理代碼}┇[finally{必須執(zhí)行的代碼}]說(shuō)明將可能發(fā)生異常的程序代碼放置在try程序塊中。程序運(yùn)行過(guò)程中,如果該塊內(nèi)的代碼沒(méi)有出現(xiàn)任何異常,后面的各catch塊不起任何作用。但如果該塊內(nèi)的代碼出現(xiàn)了異常,系統(tǒng)將終止try塊代碼的執(zhí)行,自動(dòng)跳轉(zhuǎn)到所發(fā)生的異常類對(duì)應(yīng)的catch塊中,執(zhí)行該塊中的代碼。其中的finally塊是個(gè)可選項(xiàng),如果含有finally塊,無(wú)論異常是否發(fā)生,finally塊的代碼必定執(zhí)行。一個(gè)try塊可以對(duì)應(yīng)多個(gè)catch塊,用于對(duì)多個(gè)異常類進(jìn)行捕獲。Java實(shí)例——捕獲數(shù)組下標(biāo)越界異常publicclassException1{publicstaticvoidmain(Stringargs[]){try{

inta[]={1,2,3,4,5},sum=0;for(inti=0;i<=5;i++)sum=sum+a[i];System.out.println("sum="+sum);System.out.println("Successfully!");}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("ArrayIndexOutOfBoundsException

detected");}finally{System.out.println("ProgrammFinished!");}}}例--捕獲算術(shù)異常publicclassException2{publicstaticvoidmain(Stringargs[]){try{

intx,y;x=15;y=0;System.out.println(x/y);System.out.println("Computingsuccessfully!");}catch(ArithmeticExceptione){System.out.println("ArithmeticException

catched

!");

System.out.println("Exceptionmessage:"+e.toString());}finally{System.out.println("Finallyblock.");}}2拋出異常通常情況下,異常是由系統(tǒng)自動(dòng)捕獲的。但程序員也可以自己通過(guò)throw語(yǔ)句拋出異常。throw語(yǔ)句的格式為:

thrownew異常類名(信息)其中異常類名為系統(tǒng)異常類名或用戶自定義的異常類名,“信息”是可選信息。如果提供了該信息,toString()方法的返回值中將增加該信息內(nèi)容。

拋出異常語(yǔ)句Java實(shí)例——拋出多個(gè)異常publicclassException3{publicstaticintSum(intn){if(n<0)thrownewIllegalArgumentException("n應(yīng)該為正整數(shù)!");

ints=0;for(inti=0;i<=n;i++)s=s+i;returns;}

publicstaticvoidmain(Stringargs[]){try{

intn=Integer.parseInt(args[0]);System.out.println(Sum(n));}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("命令行為:"+"javaException3<number>");}catch(NumberFormatExceptione2){System.out.println("參數(shù)<number>應(yīng)為整數(shù)!");}catch(IllegalArgumentExceptione3){System.out.println("錯(cuò)誤參數(shù):"+e3.toString());}finally{System.out.println("程序結(jié)束!");}}}在有些情況下,一個(gè)方法并不需要處理它所生成的異常,而是向上傳遞,由調(diào)用該方法的其他方法來(lái)捕獲該異常,這時(shí)就要用到throws子句。其格式如下:

返回值類型名方法名([參數(shù)表])throws異常類型名

{

聲明部分語(yǔ)句部分

}拋出異常選項(xiàng)例--拋出異常的方法publicclassException4{publicstaticintSum()throwsNegativeArraySizeException

{

ints=0;

intx[]=newint[-4];for(inti=0;i<4;i++){x[i]=i;s=s+x[i];}returns;}

publicstaticvoidmain(Stringargs[]){try{System.out.println(Sum());}catch(NegativeArraySizeExceptione){System.out.println("異常信息:"+e.toString());}}}3自定義異常類

自定義異常類可以通過(guò)繼承Exception類來(lái)實(shí)現(xiàn)。其一般形式為:

class自定義異常類名extendsException{

異常類體;}Java實(shí)例——自定義異常類classOverFlowExceptionextendsException{

OverFlowException(){System.out.println("此處數(shù)據(jù)有溢出,溢出類是OverFlowException");}}publicclassException5{publicstaticintx=100000;publicstaticintmulti()throwsOverFlowException

{intaim;aim=x*x*x;if(aim>1.0E8||aim<0){thrownewOverFlowException();}elsereturnx*x;}

publicstaticvoidmain(Stringargs[]){

inty;try{y=multi();System.out.println("y="+y);}catch(OverFlowExceptione){System.out.println(e);}}}例--處理多種異常

importjavax.swing.JOptionPane;classmathExceptionextendsException{

mathException(){System.out.println("輸入數(shù)據(jù)不正確");}}classException6{publicstaticStringname;publicstaticintpay;publicstaticvoidinputdata()throwsmathException

{try{name=JOptionPan

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論