單元7 異常處理_第1頁
單元7 異常處理_第2頁
單元7 異常處理_第3頁
單元7 異常處理_第4頁
單元7 異常處理_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單元7異常異常的概述異常的分類異常的捕獲異常的拋出自定義異常異??梢蕴岣叱绦虻慕换バ?,是在程序出現(xiàn)問題時,終止程序運行,避免擴大影響范圍。本單元重點介紹Java的異常的概念、異常的處理機制、異常的捕獲與處理以及自定義異常。單元七異常教學(xué)目標(biāo)知識目標(biāo):技能目標(biāo):素養(yǎng)目標(biāo):掌握異常的捕獲與處理理解異常的概念和異常的處理機制熟悉自定義異常能夠恰當(dāng)運用異常的捕獲和處理技術(shù)能夠正確使用自定義異常能夠獨立完成拓展任務(wù)懂得人無完人、金無足赤的道理具備知錯就改、善莫大焉的美德7.1知識儲備–異常的概述異常(Exception)是指在程序運行的過程中,可能發(fā)生的非正?,F(xiàn)象,如果不處理,程序?qū)⒈唤K止。在Java中異常產(chǎn)生的原因有三種,一是Java虛擬機產(chǎn)生的異常,即Java內(nèi)部錯誤發(fā)生的異常;二是程序代碼中的錯誤引起的異常,例如數(shù)組的索引越界異常(ArrayIndexOutofBoundsException);三是調(diào)用某些方法時,必須處理的異常,例如實例化字節(jié)輸入流FileInputStream對象時,需要在方法調(diào)用處拋出異常,或者在方法體內(nèi)捕獲異常,否則程序無法編譯成功。7.1.1異常的概述Java提供了異常類和異常處理機制幫助程序員檢查可能出現(xiàn)的異常,異常處理機制是指當(dāng)程序出現(xiàn)異常時,采取的處理方法,它能讓程序發(fā)生異常時,按照代碼的預(yù)先設(shè)定的異常處理邏輯,有針對性地處理異常,讓程序盡最大可能恢復(fù)正常并繼續(xù)執(zhí)行,從而提高程序的健壯性。Java的異常處理有5個關(guān)鍵字,分別為try、catch、throw、throws和finally。trycatch語句用于捕獲并處理異常,finally語句用于在任何情況下(除特殊情況外)都必須執(zhí)行的代碼,throw語句用于拋出異常,throws語句用于聲明可能會出現(xiàn)的異常。7.1.1異常的概述在Java中,Throwable類是的所有錯誤類Error和異常類Exception的父類。錯誤是Java運行時系統(tǒng)的內(nèi)部錯誤和資源耗盡錯誤,這種錯誤是程序無法處理的,通常不需要程序員關(guān)心。異常分為運行時異常和非運行時異常兩種,運行時異常通常是程序員失誤引起的,是可以避免和處理的;非運行時異常是必須進行捕獲或者拋出處理的,否則編譯無法通過。Throwable類的組織結(jié)構(gòu)如圖7-1所示。7.1.1異常的概述7.1知識儲備–異常的分類ThrowableErrorException非運行時異常RuntimeExceptionArrayIndexOutOfBoundsException

ArithmeticException

IOExceptionSQLExceptionClassNOtFoundException

IllegalArgumentException

MissingResourceExceptionNullPointerExceptionUnkownTypeException其他子類StackOverflowErrorNoClassDefFoundError

其他子類其他子類7.1.2異常的分類1. 常見錯誤Error(1)NoClassDefFoundError:找不到類定義錯誤(2)StackOverflowError:無限遞歸導(dǎo)致??臻g用盡錯誤(3)OutOfMemoryError:內(nèi)存溢出錯誤2. 常見非運行時異常(1)SQLException:操作數(shù)據(jù)庫異常(2)IOException:IO操作異常7.1.2異常的分類1. 常見錯誤Error(1)NoClassDefFoundError:找不到類定義錯誤(2)StackOverflowError:無限遞歸導(dǎo)致??臻g用盡錯誤(3)OutOfMemoryError:內(nèi)存溢出異常2. 常見非運行時異常(1)SQLException:操作數(shù)據(jù)庫異常(2)IOException:IO操作異常7.1.2異常的分類常見運行時異常RuntimeExceptionArrayIndexOutOfBoundsException:數(shù)組索引越界異常ArithmeticException:算術(shù)異常ClassCastException:類型強制轉(zhuǎn)換異常ClassNOtFoundException:找不到類異常MissingResourceException:缺少資源異常7.1.2異常的分類NullPointerException:空指針異常IllegalArgumentException:傳遞非法參數(shù)異常IndexOutOfBoundsException:某種類型索引越界異常NumberFormatException:數(shù)字格式異常UnkownTypeException:不可識別類型異常7.1.2異常的分類Throwable類常用的方法StringgetMessage()--返回該錯誤的詳細(xì)信息的字符串。StringtoString()--返回一個對這個異常的簡短描述。voidPrintStackTrace()--將棧軌跡信息打印到標(biāo)準(zhǔn)錯誤輸出流上。7.1.2異常的分類package.cvit;

/**

*無限遞歸導(dǎo)致的堆棧耗盡錯誤

*/

publicclassErrorDemo{

//定義test()方法,實現(xiàn)無限遞歸調(diào)用

publicstaticvoidtest(inti){

if(i==0){

return;

}else{

test(i);

}

}

publicstaticvoidmain(String[]args){

//在main()方法中調(diào)用test()方法

test(5);

}

}

7.1.2異常的分類運行結(jié)果:

7.1.2異常的分類提示:例題中的資源耗盡錯誤是沒有辦法通過異常處理機制來跳過的。main方法調(diào)用test()方法時,傳遞的實參非零,即會發(fā)生無限遞歸。7.1知識儲備–異常的捕獲一般格式使用說明案例Java語言通過面向?qū)ο蟮姆椒▉硖幚懋惓?。如果一個方法在運行過程中發(fā)生了異常,會產(chǎn)生一個異常類對象代表該異常,并將異常類對象交給運行時系統(tǒng),運行時系統(tǒng)尋找相應(yīng)的代碼來處理這一異常。Java運行時異常處理方法分為兩種,一是捕獲異常,二是拋出異常。捕獲異常是指在方法體內(nèi)將可能發(fā)生異常的代碼塊,用try…catch語句進行處理,拋出異常是指在方法聲明中使用throws關(guān)鍵字將異常拋出,由方法的調(diào)用者來處理。7.1.3異常的捕獲1.捕獲異常一般格式try{語句塊; //可能出現(xiàn)異常的代碼塊}catch(異常類型異常對象){

異常處理語句塊;}catch(異常類型異常對象){

異常處理語句塊;}……finally{

語句塊; //通常為關(guān)閉資源代碼}7.1.3異常的捕獲2.使用說明(1)try塊將可能發(fā)生異常的代碼塊包圍起來,即將這個代碼段放在try塊的大括號內(nèi),在程序執(zhí)行過程中,try塊中任意一條語句發(fā)生異常,都會跳過try塊中異常后面的語句,并根據(jù)異常類型,執(zhí)行相應(yīng)的catch塊。(2)catch塊中的異常類型,可以是異常大類型Exception,也可以是精確定位到具體的異常類,例如,如果可能發(fā)生算術(shù)異常,可以使用算術(shù)異常類ArithmeticExcepiton,也可以使用Excepiton類。(3)在捕獲異常語句中,可以有一個或多個catch塊。在通常情況下,如果try塊被執(zhí)行一次,只有一個catch塊會被執(zhí)行,不能有多個catch塊被執(zhí)行。(4)當(dāng)Java運行時環(huán)境接收到異常對象后,會依次判斷該異常對象是否是catch塊后異常類或其子類的對象,如果是,Java運行時環(huán)境將調(diào)用該catch塊來處理該異常;否則再次與下一個catch塊的異常類進行比較。(5)finally塊可以缺省,該塊主要作用是無論程序是否有異常,該塊內(nèi)代碼都會被執(zhí)行,因此,finally塊通常用于釋放資源。7.1.3異常的捕獲【例7-2】除數(shù)為0的異常處理。操作步驟:(1)在.cvit包下創(chuàng)建類TryCatchException。(2)在TryCatchException類中,定義main方法。(3)文本編輯器視圖中,撰寫代碼如下:7.1.3異常的捕獲package.cvit;

/**

*除數(shù)為零的異常

*/

publicclassTryCatchException{

publicstaticvoidmain(String[]args){

intx=10,y=2,result;

try{

//trycatch語句快捷鍵為ctrl+alt+t

result=x/y;

System.out.println(x+"/"+y+"="+result);

}catch(Exceptione){

System.out.println("除數(shù)不能為0");

}

System.out.println("程序結(jié)束?。。?);

}

}

7.1.3異常的捕獲(4)在文本編輯器視圖中,單擊運行“”按鈕,運行程序,結(jié)果如圖7-2所示。7.1.3異常的捕獲運行結(jié)果:

提示:如果對result=x/y;這條語句不使用異常捕獲處理,則無法執(zhí)行發(fā)生異常后面的語句,即無法執(zhí)行System.out.println("程序結(jié)束?。?!");語句的,如圖7-3所示。7.1.3異常的捕獲trycatch語句捕獲異常后,被捕獲部分無異常,程序可正常運行,例如除數(shù)2時,可顯示正常結(jié)果,如圖7-4所示。7.1.3異常的捕獲7.1知識儲備–異常的拋出一般格式使用說明案例Java中的異常處理除了捕獲處理之外,還可以拋出異常,由方法調(diào)用者進行異常處理。拋出異常的關(guān)鍵字是throws。1.拋出異常的一般格式[修飾符]返回值類型方法名(形參列表)throws異常類型1,異常類型2,……,異常類型n{//程序代碼}2.使用說明(1)關(guān)鍵字throws后面的異常類型可以是具體類型,也可以是異常類的父類型Exception。(2)在方法聲明中拋出異常后,調(diào)用該方法的調(diào)用處必須進行異常處理,否則報錯。7.1.4異常的拋出【例7-3】除數(shù)為0異常拋出處理。操作步驟:(1)在包.cvit下創(chuàng)建類ThrowsExcepiton。(2)在ThrowsExcepiton類中,定義main方法。(3)文本編輯器視圖中,撰寫代碼如下:7.1.4異常的拋出package.cvit;

importjava.io.FileInputStream;

publicclassThrowsExcepiton{

//定義除法方法divide(intx,inty)

publicstaticintdivide(intx,inty)throwsException{

//拋出異常,告之調(diào)用者可能有異常,需要處理

returnx/y;

}

publicstaticvoidmain(String[]args){

//定義main()方法

inta=100,b=20,result;

try{

//捕獲處理divide(intx,inty)中自帶的異常

result=divide(a,b);

System.out.println(a+“/”+b+“=”+result);

System.out.println(“try塊...”);

}catch(Exceptione){

System.out.println(“catch塊...”);

e.printStackTrace();

//輸出異常的軌跡

}finally{

System.out.println("finally塊...");

}

System.out.println("程序結(jié)束!?。?);

}

}7.1.4異常的拋出7.1.4異常的拋出(4)在文本編輯器視圖中,單擊運行“”按鈕,運行程序,結(jié)果如圖7-5所示。

運行結(jié)果:

7.1.4異常的拋出提示:當(dāng)程序可能出現(xiàn)異常,卻不確定異常類型時,可以使用Exception異常類,同時可以使用throws關(guān)鍵字在方法聲明處拋出異常,由調(diào)用者進行異常處理。當(dāng)程序發(fā)生異常時,一定會執(zhí)行catch塊,當(dāng)程序正常運行時,不執(zhí)行catch塊,例如,除數(shù)為20時,運行結(jié)果如圖7-6所示。如果有finally塊,無論程序是否正常運行,均會執(zhí)行finally塊。7.1.4異常的拋出7.1知識儲備–自定義異常一般格式使用說明案例Java雖然提供了大量的內(nèi)置異常處理類,但有時也無法完全滿足用戶的需求,此時,可以通過自定義異常來彌補這一點,自定義異常類需要繼承Exception類或其子類。1. 自定義異常的一般格式Class自定義異常名extendsException類或其子類{ //異常類代碼}7.1.5自定義異常2. 使用說明(1)自定義異常類一般包含兩個構(gòu)造方法:一個是無參的默認(rèn)構(gòu)造方法,另一個是有參構(gòu)造方法,參數(shù)為字符串型的異常消息,并調(diào)用父類構(gòu)造方法。(2)自定義異常類命名通常按照命名規(guī)范命名,例如XXXException,XXX代表異常的作用。7.1.5自定義異?!纠?-4】加數(shù)與被加數(shù)均不能為負(fù)數(shù)的自定義異常類的使用。操作步驟:(1)在包.cvit下創(chuàng)建類ScoreException。(2)在ScoreException.java文件中,創(chuàng)建自定義異常類,非法成績異常類IllegalScoreException。(3)在ScoreException類中,定義檢查成績方法checkScore和main方法。(4)文本編輯器視圖中,撰寫代碼如下:7.1.5自定義異常package.cvit;

importjava.util.Scanner;

//自定義IllegalScoreExceptio異常類,繼承Exception類

classIllegalScoreExceptionextendsException{

publicIllegalScoreException(){

//繼承Exception類的無參構(gòu)造方法

super();

}

publicIllegalScoreException(Stringmessage){

//繼承Exception類的有參構(gòu)造方法

super(message);

}

}7.1.5自定義異常publicclassScoreException{

//成績異常類ScoreException

publicstaticintcheckScore(intscore)throwsIllegalScoreException{

//定義checkScore方法,拋出自定義異常類

if(score<0){

//成績非法時,分別拋出自定義異常類信息

thrownewIllegalScoreException("成績不能為負(fù)數(shù)。");

}elseif(score>100){

thrownewIllegalScoreException("成績不能超過100分。");

}else{

returnscore;

}

}7.1.5自定義異常

//2.2定義main方法

publicstaticvoidmain(String[]args){

intscore;

System.out.print("請輸入Java成績【0,100】:");

Scannerscanner=newScanner(System.in);

score=scanner.nextInt();

//檢查成績方法調(diào)用處,捕獲處理自定義異常

try{

System.out.println("你的Java成績?yōu)?+checkScore(score)+"分。");

}catch(IllegalScoreExceptione){

System.out.println(e.getMessage());

}

}

}7.1.5自定義異常(5)在文本編輯器視圖中,單擊運行“”按鈕,運行程序,輸入成績-90,運行結(jié)果如圖7-7所示。7.1.5自定義異常運行結(jié)果:

提示:自定義的非法成績異常類與成績測試類在同一個文件ScoreException.java中。如果輸入超過100分的成績,同樣可以給出異常提示信息,如圖7-8所示。

(3)如果輸入正常范圍內(nèi)的成績,可以輸出正常成績,如圖7-9所示。(4)checkScore(intscore)必須由static修飾,否則staitc修飾的main方法無法調(diào)用成績檢查方法。7.1.5自定義異常7.2任務(wù)實現(xiàn)

7.2.1任務(wù)1:多catch塊的異常捕獲7.2.2任務(wù)2:輸入數(shù)據(jù)類型異常處理1.任務(wù)描述異常的捕獲處理中可以有多個catch塊,每次只能執(zhí)行一個catch塊,小任務(wù)通過數(shù)組的元素的訪問來體驗多個catch塊并存的情況,其中包括數(shù)組索引越異常,算術(shù)異常等,運行效果如圖7-11所示。

7.2.1任務(wù)1:多catch塊的異常捕獲2.任務(wù)分析(1)根據(jù)任務(wù)需求,創(chuàng)建類MoreCatch,實現(xiàn)多catch異常捕獲處理功能。(2)在MoreCatch類的main()方法中定義一維數(shù)組并初始化,設(shè)計出可能會出現(xiàn)算術(shù)異常的數(shù)據(jù)。(3)通過算術(shù)運算,對一維數(shù)組中元素進行訪問,設(shè)計可能出現(xiàn)異常的各種情況。7.2.1任務(wù)1:多catch塊的異常捕獲3.任務(wù)實施7.2.1任務(wù)1:多catch塊的異常捕獲4.任務(wù)小結(jié)(1)多個catch塊并存時,同時只能執(zhí)行一個catch,且異常處理原理是先小類型,再大類型,例如,算術(shù)異常和其父類異常同時出現(xiàn)時,先處理算術(shù)異常。(2)如果數(shù)組索引沒有越界且除數(shù)不為0時,可以輸出正常運行結(jié)果,例如將try塊的第2、3條語句改為:intb=a[5]/a[1];intc=a[3]/a[2];運行結(jié)果如圖7-12所示。7.2.1任務(wù)1:多catch塊的異常捕獲1.任務(wù)描述“輸入數(shù)據(jù)類型異常處理”主要通過輸入一個1-7之間的整數(shù),分別代表星期一到星期日,如果輸入非整數(shù)給出相應(yīng)的異常處理信息,運行效果如圖7-13所示。

7.2.2任務(wù)2:輸入數(shù)據(jù)類型異常處理2.任務(wù)分析(1)根據(jù)任務(wù)需求,創(chuàng)建類DataTypeException,實現(xiàn)輸入錯誤數(shù)據(jù)類型異常捕獲處理功能。(2)在DataTypeException類的main()方法中,定義代表星期的整型變量week,通過鍵盤輸入week的值,并使用多分支完成判斷,輸出對應(yīng)的星期,通過異常捕獲處理實現(xiàn)輸入錯誤數(shù)據(jù)類型數(shù)據(jù)時異常的處理。7.2.2任務(wù)2:輸入數(shù)據(jù)類型異常處理3.任務(wù)實施7.2.2任務(wù)2:輸入數(shù)據(jù)類型異常處理4.任務(wù)小結(jié)(1)如果不進行輸入類型異常捕獲處理的話,在程序運行后,輸入非整型數(shù)據(jù),系統(tǒng)直接報輸入數(shù)據(jù)類型異常并終止程序,例如:在當(dāng)前包下,復(fù)制粘貼DataTypeException類,名稱為DataTypeException1,刪除捕獲異常語句,運行結(jié)果如圖7-14所示。(2)如果輸入的整數(shù)不在1-7之間,通過switch進行了判斷,并給出“輸入錯誤”的提示。7.2.2任務(wù)2:輸入數(shù)據(jù)類型異常處理7.3任務(wù)拓展:年齡范圍限制異常處理

任務(wù)描述任務(wù)分析任務(wù)實施任務(wù)小結(jié)人無完人,金無足赤,程序同樣存在其不

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論