




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)殖場(chǎng)用工合同協(xié)議書
- 共享出行平臺(tái)信用體系構(gòu)建2025年信用評(píng)價(jià)與行業(yè)信用體系建設(shè)創(chuàng)新路徑報(bào)告
- 2025年制造業(yè)數(shù)據(jù)治理在數(shù)字化生產(chǎn)設(shè)備性能監(jiān)測(cè)中的應(yīng)用報(bào)告
- 功能性飲料在2025年運(yùn)動(dòng)人群中的市場(chǎng)推廣策略與效果評(píng)估
- 2025年工業(yè)互聯(lián)網(wǎng)平臺(tái)微服務(wù)架構(gòu)性能測(cè)試報(bào)告:云計(jì)算環(huán)境下的性能提升
- java工程師基礎(chǔ)面試試題及答案
- java程序員oracle面試題及答案
- 數(shù)字貨幣背景下貨幣政策傳導(dǎo)機(jī)制的創(chuàng)新與風(fēng)險(xiǎn)防范研究報(bào)告
- 2025年智能灌溉系統(tǒng)在現(xiàn)代農(nóng)業(yè)中的應(yīng)用與發(fā)展報(bào)告
- IABP護(hù)理考試試題及答案
- 批判教育學(xué)的流派和代表人物及其觀點(diǎn)
- 三年級(jí)下學(xué)期音樂(lè)復(fù)習(xí)題
- 農(nóng)網(wǎng)配電營(yíng)業(yè)工復(fù)習(xí)題
- 電氣畢業(yè)論文-基于-plc自動(dòng)門控制設(shè)計(jì)
- 煉鋼廠風(fēng)險(xiǎn)分級(jí)管控清單連鑄區(qū)域
- 新時(shí)期農(nóng)村初中語(yǔ)文教學(xué)中滲透心理健康教育的研究 論文
- 女性中醫(yī)保健智慧樹知到答案章節(jié)測(cè)試2023年暨南大學(xué)
- 餐飲員工入職登記表
- GA 1808-2022軍工單位反恐怖防范要求
- -衛(wèi)生資格-副高-護(hù)理學(xué)-副高-章節(jié)練習(xí)-??谱o(hù)理學(xué)-內(nèi)科疾病患者護(hù)理(多選題)(共42題)
- 一帶一路 匠心織竹-計(jì)劃書
評(píng)論
0/150
提交評(píng)論