Java面向?qū)ο蟪绦蛟O(shè)計異常處理_第1頁
Java面向?qū)ο蟪绦蛟O(shè)計異常處理_第2頁
Java面向?qū)ο蟪绦蛟O(shè)計異常處理_第3頁
Java面向?qū)ο蟪绦蛟O(shè)計異常處理_第4頁
Java面向?qū)ο蟪绦蛟O(shè)計異常處理_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論