Java語(yǔ)言程序設(shè)計(jì):第五章 異常_第1頁(yè)
Java語(yǔ)言程序設(shè)計(jì):第五章 異常_第2頁(yè)
Java語(yǔ)言程序設(shè)計(jì):第五章 異常_第3頁(yè)
Java語(yǔ)言程序設(shè)計(jì):第五章 異常_第4頁(yè)
Java語(yǔ)言程序設(shè)計(jì):第五章 異常_第5頁(yè)
已閱讀5頁(yè),還剩28頁(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)介

第五章異常天津職業(yè)技術(shù)師范大學(xué)異常基礎(chǔ)為什么需要異常?如果java程序在運(yùn)行期間出現(xiàn)了一個(gè)錯(cuò)誤。比如,文件錯(cuò)誤、設(shè)備錯(cuò)誤、物理限制、代碼錯(cuò)誤等。我們期望在出現(xiàn)錯(cuò)誤的時(shí)候,程序能返回一種安全狀態(tài),以適當(dāng)?shù)男问浇K止程序。異常處理的任務(wù)就是將控制權(quán)從產(chǎn)生錯(cuò)誤的地方傳給能夠處理這種情況的錯(cuò)誤處理代碼。天津職業(yè)技術(shù)師范大學(xué)異常分類ThrowableErrorExceptionRuntimeExcetionXException非檢查異常,描述了程序缺陷導(dǎo)致的異常??梢员苊狻R褭z查異常(RuntimeExcetion之外的異常)描述了由于某些特殊情況導(dǎo)致原本能夠正常運(yùn)行的程序無(wú)法完成的異常。強(qiáng)制檢查。Error描述了運(yùn)行時(shí)系統(tǒng)的內(nèi)部錯(cuò)誤和資源耗盡錯(cuò)誤。(JVM承擔(dān)責(zé)任)Exception描述了運(yùn)行時(shí)導(dǎo)致程序無(wú)法繼續(xù)的異常。天津職業(yè)技術(shù)師范大學(xué)Throwable的方法Throwable中定義了多個(gè)方法。因?yàn)樗械漠惓n惗际荰hrowable的子類,所以它們都繼承了Throwable的這些方法。voidprintStackTrace():將調(diào)用棧信息輸出到標(biāo)準(zhǔn)錯(cuò)誤。StringgetMessage():返回對(duì)異常的描述。StringtoString():返回一個(gè)包含異常描述的String對(duì)象。天津職業(yè)技術(shù)師范大學(xué)異常的產(chǎn)生classThrow1{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[4]; System.out.println("Beforeexception!"); a[8]=12; System.out.println("Afterexception!"); }}Beforeexception!Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:8atThrow1.main(Throw1.java:5)程序終止了執(zhí)行。天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常當(dāng)程序發(fā)生異常時(shí),會(huì)生成一個(gè)異常對(duì)象,這個(gè)對(duì)象會(huì)在方法內(nèi)部被拋出。如果程序自己不捕獲它,它就會(huì)被JVM捕獲,程序也就終止了。如果不想這樣終止,有兩種處理辦法:捕獲并處理它,讓程序繼續(xù)執(zhí)行;不處理它,直接把它交給上一級(jí)程序處理;天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常捕獲異常的基本結(jié)構(gòu):try{ //可能產(chǎn)生異常的代碼}catch(異常類型1e){ //處理異常類型1的對(duì)象e}catch(異常類型2e){ //處理異常類型2的對(duì)象e}//后續(xù)代碼如果try塊中的代碼產(chǎn)生了一個(gè)在catch語(yǔ)句中聲明的異常:程序?qū)⑻^(guò)try語(yǔ)句塊中的其他代碼;程序?qū)?zhí)行對(duì)應(yīng)的catch子句中的處理代碼;程序?qū)⒗^續(xù)執(zhí)行后續(xù)代碼;天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常classTryTest1{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[4];

try{ System.out.println("Beforeexception!"); a[8]=12; System.out.println("Afterexception"); }

catch(ArrayIndexOutOfBoundsExceptione){ System.out.println( "ArrayIndexOutOfBoundsExceptioncaught!"); }

catch(ArithmeticExceptione){ System.out.println("ArithmeticExceptioncaught!"); } System.out.println("Endup!"); }}Beforeexception!ArrayIndexOutOfBoundsExceptioncaught!Endup!天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常classTryTest2{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[4];

try{ a[0]=12; System.out.println("No!");

}

catch(ArrayIndexOutOfBoundsExceptione){System.out.println( "ArrayIndexOutOfBoundsExceptioncaught!");

} System.out.println("Endup!"); }}No!Endup!天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常classTryTest3{ publicstaticvoidmain(Stringargs[]){ inta[]={6,7,16,25,43,48,55,76}; intb[]={3,0,4,5,0,8}; for(inti=0;i<a.length;i++){

try{ System.out.println( a[i]+"/"+b[i]+"is"+a[i]/b[i]);

} catch(ArithmeticExceptione){ System.out.println("Can'tdividebyzero!");

} catch(ArrayIndexOutOfBoundsExceptione){ System.out.println( "Nomatchingelementfound!");

}} }}6/3is2Can'tdividebyzero!16/4is425/5is5Can'tdividebyzero!48/8is6Nomatchingelementfound!Nomatchingelementfound!天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常classTryTest3{ publicstaticvoidmain(Stringargs[]){ inta[]={6,7,16,25,43,48,55,76}; intb[]={3,0,4,5,0,8};

try{

for(inti=0;i<a.length;i++){ System.out.println( a[i]+"/"+b[i]+"is"+a[i]/b[i]);

}

} catch(ArithmeticExceptione){ System.out.println("Can'tdividebyzero!");

} catch(ArrayIndexOutOfBoundsExceptione){ System.out.println( "Nomatchingelementfound!");

} }}天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常當(dāng)拋出異常的時(shí)候,Java會(huì)從上向下分別對(duì)每個(gè)catch語(yǔ)句處理的異常類型進(jìn)行檢測(cè),然后按照代碼的書寫順序找出“最近”的處理程序。找到匹配的處理程序之后,它便認(rèn)為異常將得到處理,然后就不在繼續(xù)查找。查找的時(shí)候并不要求拋出的異常同處理程序所聲名的異常完全匹配。派生類的異常對(duì)象也可以匹配其基類的處理程序。天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常classTry3{ publicstaticvoidmain(Stringargs[]){ inta[]={6,7,16,25,43,48,55,76}; intb[]={3,0,4,5,0,8}; for(inti=0;i<a.length;i++){

try{ System.out.println( a[i]+"/"+b[i]+"is"+a[i]/b[i]);

} catch(ArrayIndexOutOfBoundsExceptione){ System.out.println( "Nomatchingelementfound!");

}catch(RuntimeExceptione){ System.out.println("Someexception generated!");

} } }}6/3is2Someexceptiongenerated!16/4is425/5is5Someexceptiongenerated!48/8is6Nonatchingelementfound!Nonatchingelementfound!天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常從運(yùn)行結(jié)果中我們可以看到,數(shù)組下標(biāo)越界異常被第一個(gè)catch語(yǔ)句捕獲并處理,而算術(shù)異常卻被RuntimeException類型的catch語(yǔ)句所捕獲,這是因?yàn)锳rithmeticException是RuntimeException的子類。天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常try{ System.out.println(a[i]+"/"+b[i]+"is"+a[i]/b[i]);}catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("Nomatchingelementfound!");}catch(ArithmeticExceptione){ System.out.println("Can'tdividebyzero!");}catch(RuntimeExceptione){ System.out.println("Someexceptiongenerated!");} 如果既想捕獲超類異常,又想捕獲子類異常,那么就應(yīng)該把子類的catch語(yǔ)句放在catch語(yǔ)句序列的前面。天津職業(yè)技術(shù)師范大學(xué)捕獲和處理異常classTry3{ publicstaticvoidmain(Stringargs[]){ inta[]={6,7,16,25,43,48,55,76}; intb[]={3,0,4,5,0,8}; for(inti=0;i<a.length;i++){

try{ System.out.println( a[i]+"/"+b[i]+"is"+a[i]/b[i]);

} catch(RuntimeExceptione){ System.out.println("Someexception generated!");

} catch(ArrayIndexOutOfBoundsExceptione){ System.out.println( "Nomatchingelementfound!");

}} }}Try3.java:16:已捕捉到異常java.lang.ArrayIndexOutOfBoundsExceptioncatch(ArrayIndexOutOfBoundsExceptione){^天津職業(yè)技術(shù)師范大學(xué)捕獲所有異??梢岳没怑xception捕捉所有異常。try{ //可能發(fā)生異常的代碼}catch(Exceptione){ //捕獲所有異常}但應(yīng)盡量捕獲子類異常,使程序意圖更清晰。天津職業(yè)技術(shù)師范大學(xué)當(dāng)程序發(fā)生異常時(shí),會(huì)生成一個(gè)異常對(duì)象,這個(gè)對(duì)象會(huì)在方法內(nèi)部被拋出。如果程序自己不捕獲它,它就會(huì)被JVM捕獲,程序也就終止了。如果不想這樣終止,有兩種處理辦法:捕獲并處理它,讓程序繼續(xù)執(zhí)行;不處理它,直接把它交給上一級(jí)程序處理;拋出異常天津職業(yè)技術(shù)師范大學(xué)拋出異常如果你不知道如何處理捕獲的異常,應(yīng)當(dāng)將它傳遞出去,交與上一級(jí)程序處理——拋出異常語(yǔ)法:throwaObjectofSomeException;aObjectofSomeException是某個(gè)異常的實(shí)例對(duì)象。天津職業(yè)技術(shù)師范大學(xué)拋出異常classThrow2{ publicstaticvoidmain(Stringargs[]){

try{ System.out.println("Beforethrow!");

thrownew

ArithmeticException();

} catch(ArithmeticExceptione){ System.out.println( "ArithmeticExceptioncaught!");

} System.out.println("Endup!"); }}Beforethrow!ArithmeticExceptioncaught!Endup!拋出一般是為了將異常交與上一級(jí)程序處理,這里加catch是為了觀察throw的效果。天津職業(yè)技術(shù)師范大學(xué)拋出異常classThrowDemo{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[4];

try{ a[8]=12; System.out.println("No!");

}

catch(ArrayIndexOutOfBoundsExceptione){

throwe; //不處理,直接拋出。

} System.out.println("Endup!"); }}Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException天津職業(yè)技術(shù)師范大學(xué)聲明異常對(duì)于含有throw語(yǔ)句的方法,必須在定義方法的同時(shí)聲明異?!崾臼褂么朔椒ǖ娜耍赫{(diào)用此方法的過(guò)程中可能會(huì)產(chǎn)生異常。聲明異常語(yǔ)法:在定義方法的“)”和“{”之間;添加throwsClassNameOfException;如果方法中可能拋出不止一個(gè)異常,throws后必須聲明所有可能的異常,用“,”隔開;天津職業(yè)技術(shù)師范大學(xué)拋出異常classThrowC{ //此方法必須聲明異常 publicvoidmethod1()throwsException{ System.out.println("Beforethrow!"); thrownewException(); } //此方法可不聲明異常 publicvoidmethod2(){ System.out.println("Beforethrow!"); thrownewArithmeticException(); }}如果拋出的是RuntimeException,可以不聲明。天津職業(yè)技術(shù)師范大學(xué)聲明異常throw和throws的區(qū)別:throw沒s;throws有s。throw是語(yǔ)句,用來(lái)拋出異常;而throws是聲明,說(shuō)明它所修飾的方法可能會(huì)拋出異常。throw后面跟對(duì)象;throws后面跟類名。天津職業(yè)技術(shù)師范大學(xué)拋出還是處理到底是拋出還是處理?對(duì)于RuntimeException,不應(yīng)該catch,他們屬于能夠解決的異常,應(yīng)該盡量在程序中解決掉。其他Exception,如果方法能夠解決就自己處理,否則交給上級(jí)程序處理。天津職業(yè)技術(shù)師范大學(xué)finally對(duì)于一些代碼,可能會(huì)希望無(wú)論try塊中的異常是否被拋出,它們都能得到執(zhí)行——可以在異常處理程序后面加上finally子句。try{

//可能產(chǎn)生異常的代碼}catch(Type1e){

//對(duì)異常類型Type1的異常處理代碼}………finally{

//退出try/catch代碼塊后要執(zhí)行的代碼}天津職業(yè)技術(shù)師范大學(xué)finally

publicstaticvoidmain(String[]args)throwsException{ System.out.println("step1.");

try{ System.out.println("step2."); thrownew

Exception("myexception"); }catch(Exceptione){ System.out.println("step3."); System.out.println(e.getMessage()); System.out.println("step4."); }finally{ System.out.println("step5."); } System.out.println("step6."); }step1.step2.step3.myexceptionstep4.step5.step6.天津職業(yè)技術(shù)師范大學(xué)finally publicstaticvoidmain(String[]args)throwsException{ System.out.println("step1.");

try{ System.out.println("step2.");

//thrownewException("myexception"); }catch(Exceptione){ System.out.println("step3."); System.out.println(e.getMessage()); System.out.println("step4."); }finally{ System.out.println("step5."); } System.out.println("step6."); }step1.step2.step5.step6.天津職業(yè)技術(shù)師范大學(xué)自定義異常盡管Java的內(nèi)置異常處理了大多數(shù)常見的錯(cuò)誤,但是Java的異常處理機(jī)制并不局限于處理這些錯(cuò)誤,我們可以自己定義異常類來(lái)表示程序中可能會(huì)遇到的特定問(wèn)題。

溫馨提示

  • 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ù)覽,若沒有圖紙預(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)論