版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八章異常處理1第八章異常處理8.1異常概述
8.2異常類
8.3異常拋出
8.4異常的捕獲與處理
8.5異常處理的進(jìn)一步討論
8.6提高與總結(jié)
28.1異常概述8.1.1異常的概念8.1.2異常處理機(jī)制
3
異常是方法代碼運(yùn)行時(shí)出現(xiàn)的非正常狀態(tài),這種非正常狀態(tài)使程序無法或不能再正常地繼續(xù)往下運(yùn)行。一些常見的異常包括:數(shù)組下標(biāo)越界、除數(shù)為零、內(nèi)存溢出、文件找不到等。這些異常事件發(fā)生后,會(huì)導(dǎo)致程序中斷,使程序無法或不能正常運(yùn)行下去,出現(xiàn)返回錯(cuò)誤的運(yùn)行結(jié)果、死循環(huán)、死機(jī)、莫明其妙的終止等現(xiàn)象。8.1.1異常的概念4舉例(沒有例外處理的情況)1)classExceptionDivideBy0{2)staticvoidmethod(){
intx=0,z=10;
int
y=10/x;
System.out.println(“z=“+z);}publicstaticvoidmain(String[]args){method();
System.out.println("Aftermethod.");}11)}5Exceptioninthread"main"java.lang.ArithmeticException:/byzeroatExceptionDivideBy0.method(ExceptionDivideBy0.java:4)atExceptionDivideBy0.main(ExceptionDivideBy0.java:7)Pressanykeytocontinue...6具有例外處理的情況classExceptionDivideBy0{staticvoidmethod(){
intx=0,z=10;
try{
inty=10/x;
System.out.println(“z=“+z);
}catch(ArithmeticExceptione){
System.out.println("ArithmeticException");
}
System.out.println("Aftertry/catchblocks.");}publicstaticvoidmain(String[]args){method();
System.out.println("Aftermethod.");}}7ArithmeticExceptionAftertry/catchblocks.Aftermethod.Pressanykeytocontinue...88.1.2異常處理機(jī)制main()方法的棧結(jié)構(gòu)method()方法的棧結(jié)構(gòu)拋出異常對(duì)象傳遞順序遞捕獲處理異常調(diào)用順序用圖8-1方法的調(diào)用順序和異常的傳遞順序位于棧頂?shù)姆椒檎趫?zhí)行的方法方法調(diào)用的出發(fā)點(diǎn)98.1.2異常處理機(jī)制(續(xù))
異常處理機(jī)制:當(dāng)一個(gè)方法正常執(zhí)行完畢后,Java虛擬機(jī)會(huì)從調(diào)用棧中彈出該方法的棧結(jié)構(gòu),然后繼續(xù)處理前一個(gè)方法。如果在執(zhí)行方法的過程中拋出異常,則Java虛擬機(jī)必須找到能處理異常的catch代碼塊。它首先檢查當(dāng)前方法是否存在這樣的catch代碼塊,如果存在,那么就執(zhí)行該catch代碼塊;否則,Java虛擬機(jī)會(huì)從調(diào)用棧中彈出該方法的棧結(jié)構(gòu),繼續(xù)到前一個(gè)方法中查找合適的catch代碼塊。108.1.2異常處理機(jī)制(續(xù))
當(dāng)Java虛擬機(jī)回溯到調(diào)用棧的底部方法時(shí),如果仍然沒有找到處理該異常的代碼塊時(shí),按下列步驟處理:⑴調(diào)用異常對(duì)象的printStackTrace()方法,打印來自方法調(diào)用棧的異常信息。⑵如果該線程不是主線程,那么終止這個(gè)線程,其他線程繼續(xù)正常運(yùn)行。如果該線程是主線程,那么整個(gè)應(yīng)用程序被終止。118.1.2異常處理機(jī)制(續(xù))一般來說,一個(gè)異常處理應(yīng)該完成以下三個(gè)工作(或稱三部曲):⑴拋出異常:根據(jù)異常類型產(chǎn)生異常對(duì)象⑵捕獲異常⑶處理異常128.2異常類8.2.1異常類的分類8.2.2系統(tǒng)定義的異常類8.2.3用戶自定義的異常類8.2.4受檢查的異常和不受檢查的異常
138.2.1異常類的分類每個(gè)異常由類Throwable或者它的一個(gè)子類的實(shí)例表示。Throwable類是Object類的直接子類,其本身又有兩個(gè)直接子類:Error與Exception類。148.2.1異常類的分類ThrowableErrorExceptionRuntimeException缺省的例外處理程序由用戶捕獲或聲明并處理不做處理用戶自己產(chǎn)生的例外處理158.2.2系統(tǒng)定義的異常類系統(tǒng)定義的異常類有Error類、RuntimeException類和Exception類,它們分別代表某一類異常類型。Error類及其子類:表示災(zāi)難性的、普通程序很難恢復(fù)的例外。一般情況下,程序員可不必理會(huì)這類異常,它們雖然很嚴(yán)重,但很少發(fā)生。168.2.2系統(tǒng)定義的異常類系統(tǒng)定義的異常類有Error類、RuntimeException類和Exception類,它們分別代表某一類異常類型。Error類及其子類:表示災(zāi)難性的、普通程序很難恢復(fù)的異常。
如:NoClassDefFoundError(類定義沒找到異常)、NoSuchMethodError(調(diào)用不存在的方法異常)等。一般情況下,程序員可不必理會(huì)這類異常,它們雖然很嚴(yán)重,但很少發(fā)生。178.2.2系統(tǒng)定義的異常類(2)RuntimeException類及其子類:表示設(shè)計(jì)或?qū)崿F(xiàn)方面的問題。例如:ArithmeticException(算術(shù)運(yùn)算異常)、ArrayIndexOutOfBoundsException(數(shù)組下標(biāo)越界異常)、NullPointerException(空引用異常)等。一般情況下,這類例外通過程序員正確的設(shè)計(jì)和實(shí)現(xiàn)是可以避免的。188.2.2系統(tǒng)定義的異常類(3)Exception類及其非RuntimeException子類:表示運(yùn)行時(shí)因環(huán)境的影響而引發(fā)的異常,例如:●IOException(輸入輸出異常):在I/O操作失敗或者被中斷時(shí)引發(fā)。其子類包括:EOFException、FileNotFoundException、InterruptedIOException等。●InterruptedException(中斷異常):當(dāng)前等待或睡眠線程被其他線程中斷時(shí)引發(fā)。這類異常并非因設(shè)計(jì)或?qū)崿F(xiàn)引起,是無法避免的。但一般情況下,程序員應(yīng)該提供相應(yīng)的代碼捕捉和處理。198.2.3用戶自定義的異常類創(chuàng)建用戶自定義異常時(shí),一般需要完成如下工作:⑴定義一個(gè)新的異常類,一般作為Throwable或Exception類的子類,不作為Error的子類。⑵為新的異常類定義屬性和方法,或隱藏父類的屬性和覆蓋父類的方法,使這些屬性和方法能夠體現(xiàn)該類所對(duì)應(yīng)的錯(cuò)誤信息。自定義異常類的格式為:classMyException
extends
Exception{…//定義新的成員變量…//定義構(gòu)造方法…//覆蓋原方法,或定義新方法}208.2.3用戶自定義的異常類其中,Exception類的屬性和方法。⑴異常類的構(gòu)造方法·publicException()創(chuàng)建新異常對(duì)象?!ublicException(Stringmessage)創(chuàng)建包含指定異常詳細(xì)消息的新異常對(duì)象。字符串參數(shù)message,描述異常對(duì)象的詳細(xì)消息?!ublicException(Throwablecause)創(chuàng)建包含指定原因的新異常對(duì)象。引用變量參數(shù)cause(原因),描述導(dǎo)致新異常對(duì)象拋出的異常對(duì)象?!ublicException(Stringmessage,Throwablecause)創(chuàng)建包含指定異常詳細(xì)消息和指定原因的新異常對(duì)象。218.2.3用戶自定義的異常類⑵異常類的方法·publicStringtoString()返回當(dāng)前異常對(duì)象的簡(jiǎn)短描述。格式為:“此異常的類名:異常的本地化描述”·publicStringgetMessage()返回描述當(dāng)前異常對(duì)象的詳細(xì)消息字符串?!ublicvoidprintStackTrace()在屏幕上輸出當(dāng)前異常對(duì)象使用堆棧的軌跡,即程序中先后調(diào)用了哪些方法,使得運(yùn)行過程中產(chǎn)生了這個(gè)異常對(duì)象?!ublicThrowable
getCause()返回當(dāng)前異常對(duì)象的原因(cause);如果cause不存在或未知,則返回null。·publicThrowable
initCause(Throwablecause)將當(dāng)前異常對(duì)象的原因(cause)初始化為指定值。22【例8-3】設(shè)計(jì)用戶自定義異常類。這樣,當(dāng)出現(xiàn)計(jì)算負(fù)數(shù)的平方根時(shí),可輸出提示信息:用戶自定義異常類名:輸入錯(cuò)誤!。classMyExceptionClass
extendsException{doublex;//定義新的成員變量
MyExceptionClass(doublex){
super("輸入錯(cuò)誤!"+"x="+x+",當(dāng)x的平方根為負(fù)數(shù)時(shí)引發(fā)了自定義異常。");
this.x=x;}publicStringtoString(){
return"MyExceptionClass:輸入錯(cuò)誤!";}}23【例8-4】設(shè)計(jì)用戶自定義異常類。這樣,當(dāng)出現(xiàn)小時(shí)不在0~23范圍之內(nèi)或分秒不在0~59范圍之內(nèi)的情況時(shí),可輸出提示信息。classTimeExceptionextendsException{privateint
t,m,s;
TimeException(intt,intm,ints){super("時(shí)間設(shè)置錯(cuò)誤!,當(dāng)出現(xiàn)時(shí)分秒["+t+":"+m+":"+s+"]不在范圍內(nèi)時(shí)引發(fā)了自定義異常TimeException。");
this.t=t;
this.m=m;
this.s=s;}publicStringtoString(){return"TimeException:時(shí)間設(shè)置錯(cuò)誤!["+t+":"+m+":"+s+"]";}}248.2.4受檢查的異常和不受檢查的異常⑴受檢查的異常(編譯時(shí)異常):在程序中必須對(duì)其進(jìn)行處理,否則編譯器會(huì)指出錯(cuò)誤?!ぎ?dāng)一個(gè)方法中的代碼拋出一個(gè)受檢查的異常時(shí),這個(gè)異?;蛘弑环椒ㄖ械膖ry-catch結(jié)構(gòu)捕獲,或者在方法的throws語句中聲明,并由它的調(diào)用者處理。兩者必選其一,否則編譯系統(tǒng)將給出錯(cuò)誤信息?!ぞ幾g器檢查程序,保證所有受檢查的異常都被程序顯式地處理。ObjectThrowableErrorRuntimeExceptionException受檢查異常不受檢查異常子類子類子類圖8-3
受檢查的異常和不受檢查的異常258.2.4受檢查的異常和不受檢查的異常⑵不受檢查的異常:程序中可以不做處理,直接由運(yùn)行時(shí)系統(tǒng)來處理?!?duì)這類異常,程序員可以捕捉或聲明拋出,但通??梢圆患永頃?huì)。268.3異常拋出8.3.1系統(tǒng)自動(dòng)拋出的異常8.3.2throw語句拋出的異常
27Java應(yīng)用程序在運(yùn)行過程中如果出現(xiàn)一個(gè)可識(shí)別的錯(cuò)誤,就會(huì)產(chǎn)生一個(gè)與該錯(cuò)誤相對(duì)應(yīng)的異常類對(duì)象。這個(gè)對(duì)象包含了異常的類型和錯(cuò)誤出現(xiàn)時(shí)程序所處的狀態(tài)信息,該異常對(duì)象首先會(huì)交給Java虛擬機(jī),由Java虛擬機(jī)來尋找具體的異常處理者。在Java中,把產(chǎn)生異常對(duì)象并將其交給Java虛擬機(jī)的過程稱為拋出異常。異常類不同,拋出異常的方法也不同,可分為:·系統(tǒng)自動(dòng)拋出的異常。一般是系統(tǒng)定義的異常類?!hrow語句拋出的異常。一般是用戶自定義的異常類,也可以是系統(tǒng)定義的異常類。288.3.1系統(tǒng)自動(dòng)拋出的異常Java程序運(yùn)行過程中時(shí),如果產(chǎn)生的錯(cuò)誤是屬于系統(tǒng)定義異常類所對(duì)應(yīng)的一個(gè)錯(cuò)誤,那么,系統(tǒng)將自動(dòng)拋出該類的異常對(duì)象。例如,在例8-1中,變量y除以0的算術(shù)運(yùn)算,產(chǎn)生的錯(cuò)誤對(duì)應(yīng)著算術(shù)異常類ArithmeticException,屬于系統(tǒng)定義異常類。系統(tǒng)就會(huì)自動(dòng)拋出ArithmeticException類異常對(duì)象。298.3.2throw語句拋出的異常異常既可以在發(fā)生異常情況時(shí)由運(yùn)行系統(tǒng)引發(fā),也可以在程序中用throw語句顯式引發(fā)。throw語句的一般格式如下:throw異常對(duì)象;用throw語句拋出異常的一般過程是:⑴指定或定義一個(gè)合適的異常類。⑵產(chǎn)生這個(gè)類的對(duì)象并立即用throw拋出它?!纠?-5】拋出不受檢查的異常舉例。小學(xué)生不會(huì)負(fù)數(shù)加法。當(dāng)遇到負(fù)數(shù)加法時(shí)拋出異常對(duì)象。308.3.2throw語句拋出的異常classPrimaryAdd{publicdoubleadd(doublea,doubleb){
if(a<0||b<0)
thrownew
ArithmeticException("a<0||b<0"); returna+b; }}publicclassEx8_5{publicstaticvoidmain(String[]args){
PrimaryAdd
obj=newPrimaryAdd(); System.out.println("2+3="+obj.add(2,3)); System.out.println("-2+3="+obj.add(-2,3));}}31程序運(yùn)行結(jié)果:2+3=5.0Exceptioninthread"main"java.lang.ArithmeticException:a<0||b<0atPrimaryAdd.add(Ex8_5.java:3)atEx8_5.main(Ex8_5.java:11)328.3.2throw語句拋出的異?!纠?-6】拋出受檢查的異常舉例。classPrimaryAdd{publicdoubleadd(doublea,doubleb){
if(a<0||b<0)thrownew
Exception("a<0||b<0"); returna+b;}}publicclassEx8_6{publicstaticvoidmain(String[]args){
PrimaryAdd
obj=newPrimaryAdd(); System.out.println("2+3="+obj.add(2,3)); System.out.println("-2+3="+obj.add(-2,3));}}不能通過編譯338.3.2throw語句拋出的異?!纠?.7】拋出受檢查的異常,并用throws子句聲明拋出classPrimaryAdd{publicdoubleadd(doublea,doubleb)throwsException{
if(a<0||b<0)thrownewException("a<0||b<0");returna+b;}}publicclassEx8_7{publicstaticvoidmain(String[]args)throwsException{
PrimaryAdd
obj=newPrimaryAdd();System.out.println("2+3="+obj.add(2,3)); System.out.println("-2+3="+obj.add(-2,3));}}34程序運(yùn)行結(jié)果:
2+3=5.0Exceptioninthread"main"java.lang.Exception:a<0||b<0atPrimaryAdd.add(Ex8_7.java:35)atEx8_7.main(Ex8_7.java:43)358.4異常的捕獲與處理8.4.1try/catch語句
8.4.2多異常的捕獲和處理
368.4.1try/catch語句當(dāng)一個(gè)異常被拋出時(shí),應(yīng)該有專門的語句來接受這個(gè)被拋出的異常對(duì)象,這個(gè)過程被稱為捕獲異常。在Java程序里,異常的捕獲和處理語句是同時(shí)定義的。異常對(duì)象是通過try-catch-finally語句來捕捉和處理的。該語句的語法格式如下:378.4.1try/catch語句try{//try子句是一段可能發(fā)生異常的代碼,若發(fā)生異常,由catch子句捕獲并處理;}//不能有其它語句分隔catch(要處理的異常類型1異常引用變量){//異常類型1對(duì)象的異常處理代碼;}catch(要處理的異常類型2異常引用變量){//異常類型2對(duì)象的異常處理代碼;}…finally{//總是要執(zhí)行的代碼;}…//OtherStatements388.4.1try/catch語句一個(gè)異常被拋出后,try語句處理一般分三種情況:⑴try子句內(nèi)的語句沒有發(fā)生任何異常,如果沒有finally子句,那么跳過catch子句,直接執(zhí)行try語句后面的語句OtherStatements。⑵try子句內(nèi)的語句發(fā)生異常并被catch子句捕獲,將異常對(duì)象的引用值傳遞給catch子句的參數(shù)變量,中斷現(xiàn)有的流程,跳轉(zhuǎn)到該catch子句,執(zhí)行異常處理語句。如果catch子句沒有產(chǎn)生新的異常對(duì)象,執(zhí)行完catch子句后,如果沒有finally子句,就直接執(zhí)行try語句后面的OtherStatements語句。⑶try子句內(nèi)的語句發(fā)生異常,但是沒有被catch子句捕獲。398.4.1try/catch語句例8-8classPrimaryAdd{publicdoubleadd(doublea,doubleb){ try{
if(a<0||b<0)thrownewException("a<0||b<0"); }catch(Exceptione){
System.out.println("ishandlingthisExceptionobject.");
} returna+b; }}408.4.1try/catch語句publicclassEx8_8{publicstaticvoidmain(String[]args){
PrimaryAdd
obj=newPrimaryAdd(); System.out.println("2+3="+obj.add(2,3)); System.out.println("-2+3="+obj.add(-2,3));
System.out.println("endofEx8_8");}}程序運(yùn)行結(jié)果:2+3=5.0ishandlingthisExceptionobject.-2+3=1.0endofEx8_8418.4.1try/catch語句例8-9classPrimaryAdd{publicdoubleadd(doublea,doubleb)throwsException{
if(a<0||b<0)thrownewException("a<0||b<0"); }
returna+b; }}428.4.1try/catch語句例8-9publicclassEx8_9{publicstaticvoidmain(String[]args){
PrimaryAdd
obj=newPrimaryAdd();
try{ System.out.println("2+3="+obj.add(2,3)); System.out.println("-2+3="+obj.add(-2,3));
}
catch(Exceptione){
System.out.println("mainishandlingthisExceptionobject.");
}
System.out.println("endofEx8_9");}}438.4.1try/catch語句例8-10【例8-10】在例8-3自定義異常類的基礎(chǔ)上,添加代碼,處理該異常。classMyExceptionClass
extendsException{doublex;//定義新的成員變量
MyExceptionClass(doublex){
super("輸入錯(cuò)誤!"+"x="+x+",當(dāng)x的平方根為負(fù)數(shù)時(shí)引發(fā)了自定義異常。");
this.x=x;}publicStringtoString(){
return"MyExceptionClass:輸入錯(cuò)誤!";}}448.4.1try/catch語句例8-10classSqrtCalculation{voidcalculate(doublex){
try{
if(x<0.0)thrownewMyExceptionClass(x);elseSystem.out.println(Math.sqrt(x));
}catch(MyExceptionClasse){
System.out.println("calculate()ishandlingthisMyExceptionClassobject.");
System.out.println("objectis"+e);
}
}}458.4.1try/catch語句例8-10publicclassEx8_10{publicstaticvoidmain(String[]args){
SqrtCalculation
obj=newSqrtCalculation();obj.calculate(-4);}}程序運(yùn)行結(jié)果:calculate()ishandlingthisMyExceptionClassobject.objectisMyExceptionClass:輸入錯(cuò)誤!468.4.2多異常的捕獲和處理try語句也允許有多個(gè)catch子句,每個(gè)catch子句可以捕獲一種類型的異常。每次執(zhí)行try語句時(shí),至多只能有一個(gè)異常處理代碼被執(zhí)行。catch子句的排列應(yīng)該是:先特殊,后一般或先子類,后父類,但只捕獲一次。即處理子類型異常的catch子句一定要放在處理超類型異常的catch子句之前,否則,處理子類型異常的處理代碼就沒有機(jī)會(huì)被執(zhí)行。478.4.2多異常的捕獲和處理classExceptionDemo{publicstaticvoidmain(String[]args){try{
inta=args.length;
System.out.println("a="+a);
intb=42/a;int[]c={1};c[4]=99;}catch(ArithmeticExceptione){//捕獲算術(shù)運(yùn)算異常
System.out.println("Divideby0:"+e);}catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("Arrayindexoob:"+e);
}
System.out.println("Aftertry/catchblocks.");}}48命令行沒有輸入?yún)?shù),所以args.length=0,進(jìn)而a=0,引發(fā)除零異常。命令行輸入任意參數(shù)(如“abc”)后的運(yùn)行結(jié)果是:
a=1java.lang.ArrayIndexOutOfBoundsException:4Aftertry/catchblocks.498.5異常處理的進(jìn)一步討論8.5.1沒有捕獲的異常8.5.2catch子句拋出的異常8.5.3構(gòu)造方法拋出的異常8.5.4finally子句508.5.1沒有捕獲的異常當(dāng)try子句發(fā)生異常時(shí),如果沒有一個(gè)catch子句能夠捕捉到,則按下列步驟進(jìn)行處理:⑴由外層try語句處理⑵由調(diào)用方法處理⑶由Java虛擬機(jī)執(zhí)行默認(rèn)程序518.5.2catch子句拋出的異常try子句發(fā)生的異??梢杂烧Z句中的某個(gè)catch子句捕捉處理,但在執(zhí)行catch子句內(nèi)的異常處理代碼時(shí)也可能再拋出新的異常。此時(shí),原先的異常被遺棄,新的異常從try語句拋出并沿著方法調(diào)用棧反方向傳遞。該新異?;蛘哂赏鈱觮ry語句的catch子句捕捉,或者由方法的調(diào)用者處理。528.5.3構(gòu)造方法拋出的異?!纠?-15】在例8-4自定義的TimeException類基礎(chǔ)上,對(duì)構(gòu)造方法拋出的異常進(jìn)行異常處理。classTimeExceptionextendsException{privateint
t,m,s;
TimeException(intt,intm,ints){super("時(shí)間設(shè)置錯(cuò)誤!,當(dāng)出現(xiàn)時(shí)分秒["+t+":"+m+":"+s+"]不在范圍內(nèi)時(shí)引發(fā)了自定義異常TimeException。");
this.t=t;this.m=m;this.s=s;}publicStringtoString(){return"TimeException:時(shí)間設(shè)置錯(cuò)誤!["+t+":"+m+":"+s+"]";}}538.5.3構(gòu)造方法拋出的異常classMyTime{privateinthour;//0~23privateintminute;//0~59privateintsecond;//0~59publicMyTime(int
h,int
m,ints)throwsTimeException{
if(h<0||h>=24||m<0||m>=60||s<0||s>=60){thrownewTimeException(h,m,s);}hour=h;minute=m;second=s;}}548.5.3構(gòu)造方法拋出的異常publicclassEx8_15{publicstaticvoidmain(String[]arg){
MyTimet; try{ t=newMyTime(11,69,10); }catch(TimeExceptione){
System.out.println("toString()is"+e.toString());
System.out.println("getMessage()is"+e.getMessage()); }
System.out.println("finish!");}}55程序運(yùn)行結(jié)果:toString()isTimeException:時(shí)間設(shè)置錯(cuò)誤![11:69:10]getMessage()is時(shí)間設(shè)置錯(cuò)誤!,當(dāng)出現(xiàn)時(shí)分秒[11:69:10]不在范圍內(nèi)時(shí)引發(fā)了自定義異常TimeException。finish!568.5.4finally子句只要離開try語句,都要先執(zhí)行finally子句。在try語句中,finally子句和catch子句至少出現(xiàn)一個(gè)。publicvoidoperateFile(){try{openfile;read/writefile;//可能拋出Exception異常
}catch(Exceptione){handleException;}finally{closefile;}}
578.5.4finally子句控制流離開try語句的情況可分為以下幾種:⑴try子句代碼正常執(zhí)行,沒有拋出異常;⑵try子句代碼執(zhí)行時(shí)拋出異常,但被catch子句捕捉處理;⑶try子句代碼執(zhí)行時(shí)拋出異常,但沒有catch子句能夠捕捉處理;⑷try子句代碼執(zhí)行時(shí)拋出異常,且被catch子句捕捉,但在執(zhí)行異常處理代碼時(shí)發(fā)生新的異常。588.6提高與總結(jié)8.6.1異常處理機(jī)制和編程方法總結(jié)8.6.2銀行取款的異常處理8.6.3職員年齡的異常處理598.6.1異常處理機(jī)制和編程方法總結(jié)Java語言采用面向?qū)ο蟮姆椒▉硖幚懋惓!F洚惓L幚頇C(jī)制是:⑴當(dāng)方法執(zhí)行過程中出現(xiàn)錯(cuò)誤而干擾了程序正常流程時(shí),會(huì)拋出一個(gè)異常,即構(gòu)造出一個(gè)異常類的對(duì)象。⑵異常類對(duì)象代表當(dāng)前出現(xiàn)的一個(gè)具體異常,該對(duì)象封裝了異常的有關(guān)信息。608.6.1異常處理機(jī)制和編程方法總結(jié)⑶Java虛擬機(jī)在方法調(diào)用棧中尋找能處理該異常的catch子句。它首先檢查當(dāng)前方法是否存在這樣的catch子句,如果存在,那么就執(zhí)行該catch子句;否則,沿方法調(diào)用棧中調(diào)用順序的反方向,傳遞異常對(duì)象,尋找能處理該異常的catch子句。如果始終沒有這樣的catch子句,Java虛擬機(jī)打印方法調(diào)用棧的異常信息,終止當(dāng)前線程。該異常處理機(jī)制對(duì)應(yīng)的Java語句是:try-catche-finally語句。618.6.2銀行取款的異常處理【例8-17】在定義銀行類時(shí),若取錢數(shù)大于余額則作為異常處理。
classInsufficientFundsExceptionextendsException{privateBankexcepbank;privatedoubleexcepAmount;
InsufficientFundsException(Bank
ba,doubledAmount){
excepbank=ba;
excepAmount=dAmount;}628.6.2銀行取款的異常處理publicStringtoString(){Stringstr="Thebalance"+excepbank.getbalance()+",Thewithdrawalwas"+excepAmount;returnstr;}}classBank{doublebalance;//余額
Bank(doubleb){balance=b;}638.6.2銀行取款的異常處理publicvoiddeposite(double
dAmount){//存錢
if(dAmount>0.0)balance+=dAmount;}publicvoidwithdrawal(double
dAmount)throwsInsufficientFundsException{if(balance<dAmount){thrownewInsufficientFundsException(this,dAmount);}balance=balance-dAmount;}publicdoublegetbalance(){//獲取余額
returnbalance;}}648.6.2銀行取款的異常處理publicclassEx8_17{publicstaticvoidmain(String[]args){ try{Bankba=newBank(50);ba.withdrawal(100);
System.out.println("Withdrawalsuccessful!");}catch(Exceptione){
System.out.println(e);}}}65程序運(yùn)行結(jié)果:
Thebalance50.0,Thewithdrawalwas100.0668.6.3職員年齡的異常處理【例8-18】職員年齡異常。當(dāng)職員的年齡大于60歲或小于18歲時(shí)作異常處理。classAgeGreater60ExceptionextendsException{privateEmployeeexcepEmployee;privateint
excepAge;publicAgeGreater60Exception(EmployeeexcepEmployee,int
excepAge){
super(excepEmploye
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版文化創(chuàng)意產(chǎn)業(yè)投資合作協(xié)議書模板3篇
- 綠色農(nóng)業(yè)科技與生態(tài)旅游融合
- 科技發(fā)展對(duì)現(xiàn)代安保工作提出的新挑戰(zhàn)及應(yīng)對(duì)策略
- 2025年度個(gè)人房屋抵押貸款利率調(diào)整合同
- 二零二五年度豪華度假村客房預(yù)訂與銷售合作協(xié)議3篇
- 2025年度個(gè)人汽車轉(zhuǎn)讓及二手車鑒定評(píng)估及維修服務(wù)合同3篇
- 遠(yuǎn)程教育環(huán)境下的學(xué)生安全保障措施
- 二零二五年度車輛捐贈(zèng)服務(wù)贈(zèng)與合同(公益車輛捐贈(zèng))3篇
- 2025版智慧小區(qū)物業(yè)服務(wù)與社區(qū)養(yǎng)老合作合同3篇
- 2025年度鋼材進(jìn)出口貿(mào)易代理合同2篇
- 物流服務(wù)項(xiàng)目的投標(biāo)書
- 地鐵車站低壓配電及照明系統(tǒng)
- C語言程序設(shè)計(jì)(慕課版 第2版)PPT完整全套教學(xué)課件
- 行業(yè)會(huì)計(jì)比較(第三版)PPT完整全套教學(xué)課件
- 值機(jī)業(yè)務(wù)與行李運(yùn)輸實(shí)務(wù)(第3版)高職PPT完整全套教學(xué)課件
- 高考英語語法填空專項(xiàng)訓(xùn)練(含解析)
- 42式太極劍劍譜及動(dòng)作說明(吳阿敏)
- 危險(xiǎn)化學(xué)品企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化課件
- 巨鹿二中骨干教師個(gè)人工作業(yè)績(jī)材料
- 《美的歷程》導(dǎo)讀課件
- 心電圖 (史上最完美)課件
評(píng)論
0/150
提交評(píng)論