單元7 異常處理_第1頁(yè)
單元7 異常處理_第2頁(yè)
單元7 異常處理_第3頁(yè)
單元7 異常處理_第4頁(yè)
單元7 異常處理_第5頁(yè)
已閱讀5頁(yè),還剩52頁(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)介

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

ArithmeticException

IOExceptionSQLExceptionClassNOtFoundException

IllegalArgumentException

MissingResourceExceptionNullPointerExceptionUnkownTypeException其他子類StackOverflowErrorNoClassDefFoundError

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

/**

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

*/

publicclassErrorDemo{

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

publicstaticvoidtest(inti){

if(i==0){

return;

}else{

test(i);

}

}

publicstaticvoidmain(String[]args){

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

test(5);

}

}

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

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

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

異常處理語(yǔ)句塊;}……finally{

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

/**

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

*/

publicclassTryCatchException{

publicstaticvoidmain(String[]args){

intx=10,y=2,result;

try{

//trycatch語(yǔ)句快捷鍵為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)在文本編輯器視圖中,單擊運(yùn)行“”按鈕,運(yùn)行程序,結(jié)果如圖7-2所示。7.1.3異常的捕獲運(yùn)行結(jié)果:

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

運(yùn)行結(jié)果:

7.1.4異常的拋出提示:當(dāng)程序可能出現(xiàn)異常,卻不確定異常類型時(shí),可以使用Exception異常類,同時(shí)可以使用throws關(guān)鍵字在方法聲明處拋出異常,由調(diào)用者進(jìn)行異常處理。當(dāng)程序發(fā)生異常時(shí),一定會(huì)執(zhí)行catch塊,當(dāng)程序正常運(yùn)行時(shí),不執(zhí)行catch塊,例如,除數(shù)為20時(shí),運(yùn)行結(jié)果如圖7-6所示。如果有finally塊,無(wú)論程序是否正常運(yùn)行,均會(huì)執(zhí)行finally塊。7.1.4異常的拋出7.1知識(shí)儲(chǔ)備–自定義異常一般格式使用說(shuō)明案例Java雖然提供了大量的內(nèi)置異常處理類,但有時(shí)也無(wú)法完全滿足用戶的需求,此時(shí),可以通過(guò)自定義異常來(lái)彌補(bǔ)這一點(diǎn),自定義異常類需要繼承Exception類或其子類。1. 自定義異常的一般格式Class自定義異常名extendsException類或其子類{ //異常類代碼}7.1.5自定義異常2. 使用說(shuō)明(1)自定義異常類一般包含兩個(gè)構(gòu)造方法:一個(gè)是無(wú)參的默認(rèn)構(gòu)造方法,另一個(gè)是有參構(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)建自定義異常類,非法成績(jī)異常類IllegalScoreException。(3)在ScoreException類中,定義檢查成績(jī)方法checkScore和main方法。(4)文本編輯器視圖中,撰寫(xiě)代碼如下:7.1.5自定義異常package.cvit;

importjava.util.Scanner;

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

classIllegalScoreExceptionextendsException{

publicIllegalScoreException(){

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

super();

}

publicIllegalScoreException(Stringmessage){

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

super(message);

}

}7.1.5自定義異常publicclassScoreException{

//成績(jī)異常類ScoreException

publicstaticintcheckScore(intscore)throwsIllegalScoreException{

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

if(score<0){

//成績(jī)非法時(shí),分別拋出自定義異常類信息

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

}elseif(score>100){

thrownewIllegalScoreException("成績(jī)不能超過(guò)100分。");

}else{

returnscore;

}

}7.1.5自定義異常

//2.2定義main方法

publicstaticvoidmain(String[]args){

intscore;

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

Scannerscanner=newScanner(System.in);

score=scanner.nextInt();

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

try{

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

}catch(IllegalScoreExceptione){

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

}

}

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

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

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

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

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

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

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

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論