




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java面向?qū)ο蟪绦蛟O(shè)計深圳職業(yè)技術(shù)學(xué)院軟件技術(shù)專業(yè)異常處理內(nèi)容提要4異常的基本概念123Java異常處理機(jī)制掌握try-catch語句的用法掌握throws關(guān)鍵字的用法什么是異常?classMyMath{ publicint
devide(int
x,inty){
intresult=x/y; returnresult; } }classMyMathTest{ publicstaticvoidmain(String[]args){
MyMath
mobj;
mobj=newMyMath();
intresult; result=mobj.devide(3,0);
System.out.println("theresultis"+result); } }該程序編譯能通過嗎?運行程序,有什么信息返回?異常Exceptioninthread"main"java.lang.ArithmeticException:/byzero這說明,程序發(fā)生了算術(shù)異常(ArithmeticException),非正常的結(jié)束了。這種情況就是我們說的異常異常定義了程序中遇到的非致命的錯誤,而不是編譯時的語法錯誤。如除數(shù)為0,打開一個不存在的文件,操作數(shù)越界等等。異常的基本概念運行時發(fā)生的錯誤稱為異常。如果不對異常進(jìn)行處理,那么一旦引發(fā)異常,程序?qū)⑼蝗恢兄?。要么控制?quán)返回給操作系統(tǒng)。要么系統(tǒng)處于死機(jī)崩潰狀態(tài)。因此,安全健壯的程序設(shè)計語言應(yīng)當(dāng)引入有效的異常處理機(jī)制對MyMathTest類進(jìn)行如下修改classMyMathTest{ publicstaticvoidmain(String[]args){
try{
MyMath
mobj;
mobj=newMyMath();
intresult; result=mobj.devide(3,0);
System.out.println("theresultis"+result);
}catch(Exceptione){
System.out.println(e.getMessage()); }
System.out.println("programisrunninghere."); } }說明我們看到,當(dāng)我們在程序中加了紅色的代碼后,在出現(xiàn)了異常后,程序沒有異常中止,而是正常的繼續(xù)運行。為什么會這樣呢?我們用try…catch語句對程序中可能出現(xiàn)異常的語句進(jìn)行了處理try{ statements}catch(Exceptione){statements}try…catch語句執(zhí)行過程try{
MyMath
mobj;
mobj=newMyMath();
intresult; result=mobj.devide(3,0);
System.out.println("theresultis"+result); }catch(Exceptione){
System.out.println(e.getMessage()); }
System.out.println("programisrunninghere.");catch語句塊當(dāng)try代碼塊中的程序發(fā)生了異常,系統(tǒng)將這個異常發(fā)生的代碼行號,類別等信息封裝到一個對象中,并將這個對象傳遞給catch代碼塊catch(Exceptione){ System.out.println(e.getMessage()); }Exception就是try代碼塊傳遞給catch代碼塊的變量類型,e就是變量名。問題一:e可以改為其他的名字嗎?編程實踐classNoCatch{ publicstaticvoidmain(String[]args){ Stringstr=args[0];
inti=Integer.parseInt(str);
System.out.println("輸入的數(shù)據(jù)為:"+i);
System.out.println("hereistheendoftheprogram"); } }該程序運行時,如果沒有輸入相應(yīng)的命令行參數(shù),會怎樣?如何解決?
程序修改如下classNoCatch{ publicstaticvoidmain(String[]args){
try{ Stringstr=args[0];
inti=Integer.parseInt(str);
System.out.println("輸入的數(shù)據(jù)為:"+i);
}catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("沒有輸入命令行參數(shù)");
}
System.out.println("hereistheendoftheprogram"); } }為什么?出的是什么異常?請注意,我們在catch中捕獲的是哪種類型的異常?而我們現(xiàn)在出現(xiàn)的是哪種異常?要處理這種新出現(xiàn)的異常,我們應(yīng)該怎么做呢?新增一個catch塊來捕獲這個異常catch(NumberFormatException
e1){
System.out.println("輸入數(shù)據(jù)的格式不正確");}運行結(jié)果怎樣?還會出這種異常嗎?為什么?小結(jié)try…catch語句格式try{ statements//可能產(chǎn)生異常的程序代碼}catch(ExceptionType1e){
//ExceptionType1類型異常的catch子句
statements //出現(xiàn)ExceptionType1類型異常時的處理程序}catch(ExceptionType2e){
//ExceptionType1類型異常的catch子句
statements //出現(xiàn)ExceptionType1類型異常時的處理程序}……finally{ statements //異常處理程序結(jié)構(gòu)的統(tǒng)一出口}異常結(jié)構(gòu)執(zhí)行流程試一試編寫程序以命令行參數(shù)形式輸入兩個整數(shù),要求計算并輸出兩個整數(shù)相除的商和余數(shù),程序中必須對無命令行參數(shù)或少命令行參數(shù)引起的ArrayIndexOutOfBoundsException異常、數(shù)據(jù)格式不對引起的NumberFormatException以及除數(shù)為0引起的ArithmeiticException異常分別進(jìn)行捕獲。提問我們現(xiàn)在知道,在Java中采用try…catch語句處理異常。假設(shè),MyMath類是由甲寫的,而MyMathTest類是由乙寫的,那么,在乙使用MyMathTest類時,怎么能知道devide方法有可能出現(xiàn)異常呢?他又怎么會想到用try…catch語句去處理呢?在Java中,我們可以通過throws關(guān)鍵字來解決這個問題。修改MyMath類classMyMath{ publicint
devide(int
x,inty)throwsException{
intresult=x/y; returnresult; } }classMyMathTest{ publicstaticvoidmain(String[]args){
MyMath
mobj;
mobj=newMyMath();
intresult;
result=mobj.devide(3,1);
System.out.println("theresultis"+result); } }注意,此時程序應(yīng)該不會發(fā)生異常,但程序能編譯通過嗎?將MyMathTest類中添加try…catch語句publicstaticvoidmain(String[]args){
try{
MyMath
mobj;
mobj=newMyMath();
intresult; result=mobj.devide(3,0);
System.out.println("theresultis"+result);
}catch(Exceptione){
System.out.println(e.getMessage()); } } throws關(guān)鍵字如果在一個方法中的語句執(zhí)行時可能生成某種異常,但又不能確定如何處理,則此方法應(yīng)聲明拋出異常(如throwsException),表明該方法不對這些異常進(jìn)行處理,而由該方法的調(diào)用者負(fù)責(zé)處理。對于檢查型異常,調(diào)用者要么用try…catch語句進(jìn)行處理(如上面我們的做法);要么繼續(xù)拋出該異常(如在上面的程序中,我們是在main方法中調(diào)用devide方法的,如果在main方法中不處理Exception類型異常,可以繼續(xù)拋出該異常)。publicstaticvoidmain(String[]args)throwsException問題我們在前面的例子中,如果我們要從鍵盤輸入數(shù)據(jù),我們是如何寫的?publicstaticvoidmain(String[]args)throwsIOException{
BufferedReaderrd;rd=newBufferedReader(new
InputStreamReader(System.in));Stringstr1=rd.readLine();
……}為什么要添加throwsIOException?如果不添加throwsIOException,編譯能通過嗎?還可以怎樣修改?試一試請分別使用兩種方法修改下面程序,使程序能正常編譯運行。classThrowDemo{ publicstaticvoidmethodDemo(inti)throwsIOException,ClassNotFoundException{
if(i>0)thrownewIOException();
if(i<0)thrownewClassNotFoundException();}publicstaticvoidmain(String
args[]){ if(args[0].length<1){
System.out.println(“請以命令行參數(shù)形式輸入1個整數(shù)”); return;}inti=Integer.parseInt(args[0]);methodDemo(i);}}異常分類Error異常Error異常:運行時間出現(xiàn)的系統(tǒng)內(nèi)部的錯誤以及資源耗盡等情況。如:虛擬機(jī)內(nèi)部發(fā)生錯誤、電源斷電引起的異常中止等。特點:這類異常性質(zhì)嚴(yán)重,本身難以控制,且恢復(fù)可能性極小,意義不大。Java不要求對這類異常進(jìn)行必要的控制,編譯期也不對這類異常進(jìn)行檢測。RuntimeException異常RuntimeException及其子類描述的異常,一般是由于編程錯誤引起的異常。如:錯誤的造型、數(shù)組越界存取、空指針訪問等。特點:完全可以通過改進(jìn)程序加以克服,且數(shù)目很大。Java對這種異常的處理:編譯時,不對這類異常進(jìn)行檢測;運行時,會自動在異常發(fā)生處生成相應(yīng)的異常的對象,并由系統(tǒng)默認(rèn)的異常處理器處理(通常輸出錯誤信息及錯誤地點)。應(yīng)用程序可以對其進(jìn)行捕獲處理(但不提倡)。運行環(huán)境引發(fā)的異常運行環(huán)境引發(fā)的異常。如:網(wǎng)絡(luò)不通,文件找不到等。特點:只要運行環(huán)境正常,程序是可以正常運行的。Java要求對這類異常進(jìn)行必要的控制。試一試classMyMath{ publicint
devide(int
x,inty)throwsArithmeticException{
intresult=x/y; returnresult; } }classMyMathTest{ publicstaticvoidmain(String[]args){
MyMath
mobj;
mobj=newMyMath();
intresult; result=mobj.devide(3,0);
System.out.println("theresultis"+result); } }檢查和非檢查型異常非檢查型異常:編譯期間編譯器不對其進(jìn)行檢查的異常,包括Error類和RuntimeException類及其子類。檢查型異常:除非檢查型異常以外的其它異常。編譯時,編譯器對方法進(jìn)行分析,如方法中有產(chǎn)生這種異常的可能,那么方法中要么有異常的處理模塊,要么必須在方法頭部拋出異常,否則,不能通過編譯。那么,Exception是檢查型還是非檢查型異常?ArithmeticException呢?自定義異常自定義異常也是一個類,如果我們要創(chuàng)建檢查型的異常,我們可以繼承Exception類;如果我們要創(chuàng)建非檢查型的異常,我們可以繼承RuntimeException
類如何創(chuàng)建自定義異常打開MyMath.java文件,假設(shè)我們在devide方法中不允許有負(fù)的除數(shù),當(dāng)接收到一個負(fù)的除數(shù)時,程序返回一個自定義的異常,通知調(diào)用者。首先創(chuàng)建一個異常類DevideByMinusExceptionclassDevideByMinusExceptionextendsException{ //定義子類構(gòu)造器方法
publicDevideByMinusException(String
msg){
super(msg); }}拋出自定義異常 classMyMath{ publicint
devide(int
x,inty)
throwsArithmeticException,DevideByMinusException{
if(y<0)thrownewDevideByMinusException("除數(shù)為負(fù)數(shù)");
intresult=x/y; returnresult; } }throw關(guān)鍵字用throw語句可以創(chuàng)建并拋出明確的異常語法形式:ThrownewxxException();如:
try{
if(flag<0){ thrownewNullPointerException(); } }……調(diào)用者需做的修改classMyMathTest{ publicstaticvoidmain(String[]args){ try{
MyMath
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國螺旋埋弧焊管行業(yè)發(fā)展?fàn)顩r及營銷戰(zhàn)略研究報告
- 2025-2030年中國營養(yǎng)煲行業(yè)運行動態(tài)分析與營銷策略研究報告
- 2025-2030年中國花椒大料行業(yè)運營狀況及發(fā)展前景分析報告
- 2025-2030年中國膦酸脲行業(yè)運行狀況與前景趨勢分析報告
- 2025-2030年中國膠合板行業(yè)十三五規(guī)劃及發(fā)展盈利分析報告
- 2025-2030年中國紙杯機(jī)行業(yè)運行狀況及前景趨勢分析報告
- 2025-2030年中國粽子行業(yè)十三五規(guī)劃及發(fā)展盈利分析報告
- 2025江西省建筑安全員-B證考試題庫附答案
- 珠??萍紝W(xué)院《邊緣計算》2023-2024學(xué)年第二學(xué)期期末試卷
- 香港(2024年-2025年小學(xué)二年級語文)人教版期末考試試卷(含答案)
- 浙江省臺州市2024年中考語文模擬試題及答案6
- 山水情懷 課件-2024-2025學(xué)年高中美術(shù)人教版 (2019) 選擇性必修2 中國書畫
- GA 2139-2024警用防暴臂盾
- 辦公軟件題庫(173道)
- 2024數(shù)字化風(fēng)電場智慧運營
- ISO9001、ISO14001和ISO45001質(zhì)量環(huán)境及職業(yè)健康安全三個體系的對比
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)基礎(chǔ)教程(高校創(chuàng)新創(chuàng)業(yè)教育課程)全套教學(xué)課件
- 2024年內(nèi)蒙古交通職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫完整
- 天津和平區(qū)2024屆高三一模數(shù)學(xué)試題(解析版)
- 《中東》地圖填圖專練
評論
0/150
提交評論