版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
T1publicclasst1{publicstaticvoidmain(String[]args){intarr[]={35,0,5,7,9,-5};for(intk=0;k<arr.length;k=k+2)System.out.println(arr[k]);}}T1publicclasst1{1T1answer3559T1answer352T2publicclasst2{publicstaticvoidmain(String[]args){intarr[][]={{35,0,5},{6,7,9},{-1,-2,-3}};for(intk=0;k<arr.length;k++)for(intj=0;j<arr[k].length;j++)System.out.println(arr[k]);}}T2publicclasst2{3T2answer[I@7d772e[I@7d772e[I@7d772e[I@11b86e7[I@11b86e7[I@11b86e7[I@35ce36[I@35ce36[I@35ce36T2answer[I@7d772e4publicclassT3{staticpublicvoidswap(intarr[],intpos1,intpos2){inttmp=arr[pos1];arr[pos1]=arr[pos2];arr[pos2]=tmp;}staticvoiddispaly(intarr[]){for(inti=0;i<arr.length;i++)System.out.print(arr[i]+"\t");System.out.println();}publicstaticvoidmain(String[]args){inta[]={1,2,3,4,5};T3.dispaly(a);T3.swap(a,1,2);T3.dispaly(a);}}publicclassT3{51234513245123456教學(xué)目的要求1.理解異常概念,理解Java中拋棄異常和聲明拋棄異常的區(qū)別與聯(lián)系;2.掌握Java的異常處理機制,學(xué)會如何合理應(yīng)用異常處理機制;3.會使用捕獲異常和聲明拋棄異常的兩種異常處理的方法。第4講異常(Exception)處理教學(xué)目的要求1.理解異常概念,理解Java中拋棄異常和聲明71
異常的概念2
異常處理3
自定義異常處理類4
應(yīng)用舉例本章內(nèi)容1異常的概念本章內(nèi)容81.異常的概念
Java中將運行錯誤分為兩類:錯誤和異常。
致命性錯誤:如程序進入死循環(huán),或遞歸無法結(jié)束,或內(nèi)存溢出,這類現(xiàn)象稱為錯誤。錯誤只能在編程階段解決,只能依靠其他程序干預(yù),否則會一直處于非正常狀態(tài)。
非致命性的異常:如運算時除數(shù)為0,或操作數(shù)超出范圍,或打開一個文件時發(fā)現(xiàn)文件并不存在,或欲裝入的類文件丟失,或網(wǎng)絡(luò)連接中斷等,這類現(xiàn)象稱為異常。
1.異常的概念Java中將運行錯誤分為兩類:錯9
沒有錯誤處理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1異常的概念沒有錯誤處理的程序:1異常的概念101異常的概念
在C/C++語言中,通過使用if語句來判斷是否出現(xiàn)了錯誤,同時,調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯誤事件并進行處理。但是,這種錯誤處理機制會導(dǎo)致不少問題,因為在很多情況下需要知道錯誤產(chǎn)生的內(nèi)部細節(jié)。
通常,用某個全局變量來存儲一個異常事件的類型,這容易導(dǎo)致誤用,因為該全局變量的值有可能在被處理前被另外的錯誤覆蓋掉。此外,即使最優(yōu)美的C語言程序,為了處理異常情況,也常常求助于goto語句。
1異常的概念在C/C++語言中,通過使用if語句來111異常的概念
以常規(guī)方法處理錯誤:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1異常的概念以常規(guī)方法處理錯誤:12
用常規(guī)方法處理錯誤存在的主要問題有:部分精力花在錯誤處理上;只處理能夠想到的錯誤,對未知的情況無法處理;程序可讀性差,大量的錯誤處理代碼混雜在程序中;出錯返回信息量太少,無法更確切地了解錯誤狀況或原因。
1異常的概念用常規(guī)方法處理錯誤存在的主要問題有:1異常的概念131異常的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓绦蛑械姆菄乐劐e誤,在Java中,非嚴重錯誤被稱為異常(Exception)。在一個方法的運行過程中,如果發(fā)生了異常,則這個方法(或者是Java虛擬機)生成一個代表該異常的對象(包含了該異常的詳細信息),并把它交給運行時系統(tǒng),運行時系統(tǒng)尋找相應(yīng)的代碼來處理這一異常。我們把生成異常對象并把它提交給運行時系統(tǒng)的過程稱為拋棄(throw)一個異常。運行時系統(tǒng)在方法的調(diào)用棧中查找,從生成異常的方法開始進行回朔,直到找到包含相應(yīng)異常處理的方法為止,這一個過程稱為捕獲(catch)一個異常。1異常的概念Java通過面向?qū)ο蟮姆椒▉硖幚?41異常的概念
用異常的形式處理錯誤:{
try{
openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}
catch(fileopenFailed) {dosomething;}
catch(sizeDetermineFailed) {dosomething;}
catch(memoryAllocateFailed) {dosomething;}
catch(readFailed) {dosomething;}
catch(fileCloseFailed) {dosomething;}
finally {dosomething;}}1異常的概念用異常的形式處理錯誤:152異常處理
6.2.1Java中的Throwable類
Java中的所有異常都是由Throwable類的子類生成的對象,所有的異常類都是Throwable類的子類或子類的子類。下圖給出了部分Java中部分錯誤類、異常類的繼承關(guān)系。2異常處理6.2.1Java中的Throwable16根據(jù)程序?qū)﹀e誤與異常的處理方式,可以將Java中的異常分為兩類:
Error:是一些嚴重的程序不能處理的系統(tǒng)錯誤類
,包括內(nèi)存溢出、動態(tài)鏈接失敗、虛擬機錯誤等,Java程序不做處理。
Exception:一般程序中可預(yù)知的問題,其產(chǎn)生的異常可能會帶來意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常。2異常處理根據(jù)程序?qū)﹀e誤與異常的處理方式,可以將Java中的異常分為兩172異常處理ThrowableErrorExceptionRuntimeException缺省的異常處理程序由用戶捕獲或聲明并處理不做處理用戶自己產(chǎn)生的異常處理2異常處理ThrowableErrorExceptionR182異常處理
——一些常用的異常類Error(allinjava.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)…2異常處理Error(allinjava.lang)19Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException2異常處理
——一些常用的異常類Exception(injava.lang)2異常處理20RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)…2異常處理
——一些常用的異常類RuntimeException2異常處理21ExceptionIOException(injava.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOExceptionStreamCorruptedExceptionJ.MalformedURLException……2異常處理
——一些常用的異常類Exception2異常處理22
異常示例:(1)編譯時異常:在程序中必須對其進行處理,否則編譯器會指出錯誤。在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運行時異常:程序中可以不做處理,直接由運行時系統(tǒng)來處理。2異常處理異常示例:2異常處理23try-catch-finally語句
Java的異常處理是通過3個關(guān)鍵詞來實現(xiàn)的:try-catch-finally。用try來監(jiān)視執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)就會拋出(throws)異常,可以通過異常的類型來捕捉(catch)并處理它,或最后(finally)由缺省處理方法來處理。2異常處理-捕獲異常try-catch-finally語句2異常處理-捕獲異24try代碼段包含可能產(chǎn)生異常的代碼try代碼段后跟有一個或多個catch代碼段每個catch代碼段聲明其能處理的一種特定類型的異常每個catch代碼段都是一段異常處理代碼程序繼續(xù)執(zhí)行最后一個catch代碼段后的代碼
(或執(zhí)行完finally代碼段后)不同的代碼段是不同的作用域,不可訪問相互之間定義的局部變量try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生
//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標識符){//處理異常;}catch(要處理的異常種類和標識符){//處理異常;}…finally{//最終處理(缺省處理);}…//OtherStatements2異常處理-捕獲異常try代碼段包含可能產(chǎn)生異常的代碼try{2異常處理-捕獲252異常處理-捕獲異常try語句
捕獲異常的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理異常的范圍。在執(zhí)行過程中,該段代碼可能會產(chǎn)生并拋棄一個或多個異常,因此,它后面的catch語句進行捕獲時也要做相應(yīng)的處理。
如果沒有異常產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。2異常處理-捕獲異常try語句262異常處理-捕獲異常catch語句每個try語句必須伴隨一個或多個catch語句,用于捕獲try代碼塊所產(chǎn)生的異常并做相應(yīng)的處理。catch語句有一個形式參數(shù),用于指明其所能捕獲得異常類型,運行時系統(tǒng)通過參數(shù)值把被拋棄的異常對象傳遞給catch語句。程序設(shè)計中要根據(jù)具體的情況來選擇catch語句的異常處理類型,一般應(yīng)該按照try代碼塊中異??赡墚a(chǎn)生的順序及其真正類型進行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當(dāng)然也可以用一個catch語句處理多個異常類型,這時它的異常類型應(yīng)該是這多個異常類型的父類,但這種方式使得在程序中不能確切判斷異常的具體類型。2異常處理-捕獲異常catch語句27publicclassL4_02{publicstaticvoidmain(String[]args){inta,b,c;a=9;b=0;c=a/b;System.out.println(a+"/"+b+"="+c);}}沒有捕獲異常publicclassL4_02{沒有捕獲異常28運行結(jié)果Exceptioninthread"main"java.lang.ArithmeticException:/byzeroat異常處理.L4_02.main(L4_02.java:7)運行結(jié)果Exceptioninthread"main"29//處理被除數(shù)為0產(chǎn)生的異常舉例,Li4_01.javapublicclassLi4_01{publicstaticvoidmain(Stringargs[]){inta,b,c;try{ a=9; b=0; c=a/b; System.out.println(a+"/"+b+"="+c);}catch(ArithmeticExceptione){ System.out.println("出現(xiàn)被0除的異常情況");}System.out.println("java程序運行結(jié)束!");}}
//處理被除數(shù)為0產(chǎn)生的異常舉例,Li4_01.java30運行結(jié)果出現(xiàn)被0除的異常情況java程序運行結(jié)束!運行結(jié)果出現(xiàn)被0除的異常情況312異常處理-捕獲異常
finally語句捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。
無論try所指定的程序塊中是否拋出異常,也無論catch語句的異常類型是否與所拋棄的異常的類型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。通常在finally語句中可以進行資源的清除工作,如關(guān)閉打開的文件、刪除臨時文件等。2異常處理-捕獲異常finally語句32try{
in=newFileInputStream(“file1.txt”);
對文件進行處理的程序;}catch(IOExceptione){//對文件異常進行處理;}finally{//不論是否發(fā)生異常,都關(guān)閉文件;}finally在文件處理時非常有用
異常的覆蓋
finally代碼段中應(yīng)該把可能產(chǎn)生異常的語句用try-catch保護起來if(in!=null){try{in.close();}catch(IOExceptione){…}}//用try-catch結(jié)構(gòu),防止finally代碼段拋出異常try{finally在文件處理時非常有用異常的覆蓋if33throw和throws語句
如果在一個方法中生成了異常,但是該方法并不處理它產(chǎn)生的異常,而是沿著調(diào)用層次向上傳遞,交由調(diào)用它的方法來處理這些異常,這就是聲明異常。
2異常處理throw和throws語句2異常處理34publicvoidmethod1(){
intx;try{System.out.print("Inputx:");Scannersc=newScanner(System.in);x=sc.nextInt();intz=compute(x);System.out.println("z="+z);}catch(ArithmeticExceptione){System.out.println("devidedby0");}}publicintcompute(intx)throwsArithmeticException{intz=100/x;returnz;}method1compute異常異常拋出處理調(diào)用publicvoidmethod1()publicin35非運行時異常Throwable、Exception運行時異常Error、RuntimeException當(dāng)在一個方法的代碼中拋出一個受檢查的異常時,這個異常或者被方法中的try-catch結(jié)構(gòu)捕獲,或者在方法的throws語句中聲明編譯器檢查程序,保證所有非運行時異常都被程序顯式地處理ThrowableErrorExceptionRuntimeException2異常處理非運行時異常ThrowableErrorExceptionR362異常處理
聲明異常首先必須生成異常。前面所提到的異常或者是由Java虛擬機生成,或者是由Java類庫中的某些類生成。事實上,我們在程序中也可以生成自己的異常對象,也即是異??梢圆皇浅鲥e產(chǎn)生,而是人為地拋出。不論那種方式,生成異常對象都是通過throw語句實現(xiàn):
thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;
注意:拋出的異常必須是Throwable或其子類的實例。2異常處理聲明異常首先必須生成異常。前面所提到的異37任何從Throwable派生的類都可以用throw語句拋出,拋出異常用來表明程序遇到的錯誤無法正常執(zhí)行而需要異常處理thrownewMyException(“someinfomation”);異常可以由try代碼段中的語句拋出也可以從被try代碼段中調(diào)用的方法中拋出異常還可能產(chǎn)生于數(shù)組下標越界以及Java虛擬機內(nèi)部錯誤等Exception和Error是Throwable的直接派生類Exception,程序應(yīng)該處理的異常Error代表系統(tǒng)嚴重錯誤,一般程序不處理這類錯誤異常拋出點后的代碼在拋出異常后不再執(zhí)行也可以說異常的拋出終止了代碼段的執(zhí)行2異常處理任何從Throwable派生的類都可以用throw語句拋出,383自定義異常處理類
當(dāng)我們在設(shè)計自己的類包時,應(yīng)盡最大的努力為用戶提供最好的服務(wù),并且希望用戶不要濫用我們所提供的方法,當(dāng)程序出現(xiàn)某些異常事件時,我們希望程序足夠健壯以從程序中恢復(fù),這時就需要用到異常。在選擇異常類型時,可以使用Java類庫中已經(jīng)定義好的類,也可以自己定義異常類。自定義異常類不是由Java系統(tǒng)監(jiān)測到的異常(如數(shù)組下標越界,被0除等),而是由用戶自己定義的異常。自定義異常同樣要用try-catch-finally捕獲,但必須由用戶自己拋出(throw)。3自定義異常處理類當(dāng)我們在設(shè)計自己的類包時,39
異常是一個類,自定義異常必須繼承自Throwable或Exception類。建議:
異常一定是不經(jīng)常發(fā)生的故障,應(yīng)避免把控制流程作為異常處理。盡量使用JDK提供的異常類:重用、便于理解。用Exception/RuntimeException類:編譯時異常、運行時異常。一般不把自定義異常作為Error的子類,因為Error通常被用來表示系統(tǒng)內(nèi)部的嚴重故障。ThrowableErrorExceptionRuntimeException自定義異常處理異常是一個類,自定義異常必須繼承自Throwabl403自定義異常處理類
當(dāng)自定義異常是從RuntimeException及其子類繼承而來時,該自定義異常是運行時異常,程序中可以不捕獲并處理它。當(dāng)自定義異常是從Throwable、Exception及其其他子類繼承而來時,該自定義異常是編譯時異常,也即程序中必須捕獲并處理它。自定義異常的形式:classMyExceptionextendsException{…}3自定義異常處理類當(dāng)自定義異常是從RuntimeE413自定義異常處理類
例1:計算兩個數(shù)之和,當(dāng)任意一個數(shù)超出范圍(本例為10~20)時,拋出自己的異常。publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}3自定義異常處理類例1:計算兩個數(shù)之和,當(dāng)任意42public
classAddTwoNumber{public
static
intCalcAnswer(Stringstr1,Stringstr2)throwsNumberRangeException{
intint1,int2;
intanswer=-1;
try{int1=Integer.parseInt(str1);int2=Integer.parseInt(str2);
if((int1<10)||(int1>20)||(int2<10)||(int2>20)){NumberRangeExceptione=newNumberRangeException("Numbersnotwithinthespecifiedrange.");
throwe;}answer=int1+int2;}catch(NumberFormatExceptione){System.out.println(e.toString());}
returnanswer;}//endofCalcAnswer()publicclassAddTwoNumber{43public
static
voidmain(String[]args){StringanswerStr;
try{
intanswer=CalcAnswer("12",“9");
answerStr=String.valueOf(answer);}catch(NumberRangeExceptione){answerStr=e.getMessage();}System.out.println(answerStr);}//endofmain()}//endofclasspublicstaticvoidmain(String44Numbersnotwithinthespecifiedrange.Numbersnotwithinthespecifi454應(yīng)用舉例
publicclassDivByZero{intx;inty;DivByZero(inta,intb){x=a;y=b;}//endofDivByZero()publicvoidtest()throwsDivideByZeroException{if(y==0)thrownewDivideByZeroException();elseSystem.out.println(x/y);}publicstaticvoidmain(Stringargs[]){DivByZeromy=newDivByZero(5,0);//對5除以0測試
try{my.test();}catch(DivideByZeroExceptione){System.out.println("DivideByZero.零作除數(shù)。");}}//endofmain()}//endofclasspublicclassDivideByZeroExceptionextendsException{publicDivideByZeroException(){System.out.println("CallDivideByZeroException()");}}//endofclass例2使用自定義DivideByZeroException類,繼承Exception類,用于處理被0除的異常。當(dāng)異常出現(xiàn)時,強制程序員處理它。程序源代碼如下:4應(yīng)用舉例publicclassDivByZero46CallDivideByZeroException()DivideByZero.零作除數(shù)。CallDivideByZeroException()47本章小結(jié)
異常處理的一般格式:Java的異常處理機制使得處理異常的代碼和“常規(guī)”代碼分開,減少了代碼的數(shù)量,增強了程序的可讀性(可以對比用if語句來處理異常的情形,這時需要進行一系列條件的判定)。try{
Javastatement;}catche(ExceptionType1ExceptionObject1){
ExceptionObject1handling;}catche(ExceptionType2ExceptionObject2){
ExceptionObject2handling;}…}finally{
finalhandling;//統(tǒng)一的出口,最終必定要執(zhí)行}本章小結(jié)異常處理的一般格式:Java的異常處理機制使得處理48
Java的異常處理機制使得異常事件可以沿調(diào)用堆棧自動向上傳播,沿著被調(diào)用的順序往前尋找,只要找到符合該異常種類的異常處理程序,就交給這部分程序去處理。本章小結(jié)Method1Method2Method3Read-filecallcallcalltry-catch產(chǎn)生異常throwsthrowsthrowsJava的異常處理機制使得異常事件可以沿調(diào)用堆棧自動向上傳49本章小結(jié)Java通過面向?qū)ο蟮姆椒ㄟM行異常處理,把各種不同的異常事件進行分類,體現(xiàn)了良好的層次性,提供了良好的接口,這種機制對于具有動態(tài)運行特性的復(fù)雜程序提供了強有力的控制。由于把異常事件當(dāng)成對象來處理,利用類的層次性可以把多個具有相同父類的異常統(tǒng)一處理,也可以區(qū)分不同的異常分別處理,使用非常靈活。當(dāng)然,從另一方面來看,在捕獲或聲明異常時,要選取合適類型的異常類,注意異常的類層次,根據(jù)不同的情況使用一般或特殊的異常類。應(yīng)該根據(jù)具體的情況選擇在何處處理異常?;蛘咴诜椒▋?nèi)捕獲并處理,或者用throws子句把它交給調(diào)用棧中上層的方法去處理。本章小結(jié)Java通過面向?qū)ο蟮姆椒ㄟM行異常處理,把各種不同50T1publicclasst1{publicstaticvoidmain(String[]args){intarr[]={35,0,5,7,9,-5};for(intk=0;k<arr.length;k=k+2)System.out.println(arr[k]);}}T1publicclasst1{51T1answer3559T1answer3552T2publicclasst2{publicstaticvoidmain(String[]args){intarr[][]={{35,0,5},{6,7,9},{-1,-2,-3}};for(intk=0;k<arr.length;k++)for(intj=0;j<arr[k].length;j++)System.out.println(arr[k]);}}T2publicclasst2{53T2answer[I@7d772e[I@7d772e[I@7d772e[I@11b86e7[I@11b86e7[I@11b86e7[I@35ce36[I@35ce36[I@35ce36T2answer[I@7d772e54publicclassT3{staticpublicvoidswap(intarr[],intpos1,intpos2){inttmp=arr[pos1];arr[pos1]=arr[pos2];arr[pos2]=tmp;}staticvoiddispaly(intarr[]){for(inti=0;i<arr.length;i++)System.out.print(arr[i]+"\t");System.out.println();}publicstaticvoidmain(String[]args){inta[]={1,2,3,4,5};T3.dispaly(a);T3.swap(a,1,2);T3.dispaly(a);}}publicclassT3{5512345132451234556教學(xué)目的要求1.理解異常概念,理解Java中拋棄異常和聲明拋棄異常的區(qū)別與聯(lián)系;2.掌握Java的異常處理機制,學(xué)會如何合理應(yīng)用異常處理機制;3.會使用捕獲異常和聲明拋棄異常的兩種異常處理的方法。第4講異常(Exception)處理教學(xué)目的要求1.理解異常概念,理解Java中拋棄異常和聲明571
異常的概念2
異常處理3
自定義異常處理類4
應(yīng)用舉例本章內(nèi)容1異常的概念本章內(nèi)容581.異常的概念
Java中將運行錯誤分為兩類:錯誤和異常。
致命性錯誤:如程序進入死循環(huán),或遞歸無法結(jié)束,或內(nèi)存溢出,這類現(xiàn)象稱為錯誤。錯誤只能在編程階段解決,只能依靠其他程序干預(yù),否則會一直處于非正常狀態(tài)。
非致命性的異常:如運算時除數(shù)為0,或操作數(shù)超出范圍,或打開一個文件時發(fā)現(xiàn)文件并不存在,或欲裝入的類文件丟失,或網(wǎng)絡(luò)連接中斷等,這類現(xiàn)象稱為異常。
1.異常的概念Java中將運行錯誤分為兩類:錯59
沒有錯誤處理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1異常的概念沒有錯誤處理的程序:1異常的概念601異常的概念
在C/C++語言中,通過使用if語句來判斷是否出現(xiàn)了錯誤,同時,調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯誤事件并進行處理。但是,這種錯誤處理機制會導(dǎo)致不少問題,因為在很多情況下需要知道錯誤產(chǎn)生的內(nèi)部細節(jié)。
通常,用某個全局變量來存儲一個異常事件的類型,這容易導(dǎo)致誤用,因為該全局變量的值有可能在被處理前被另外的錯誤覆蓋掉。此外,即使最優(yōu)美的C語言程序,為了處理異常情況,也常常求助于goto語句。
1異常的概念在C/C++語言中,通過使用if語句來611異常的概念
以常規(guī)方法處理錯誤:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1異常的概念以常規(guī)方法處理錯誤:62
用常規(guī)方法處理錯誤存在的主要問題有:部分精力花在錯誤處理上;只處理能夠想到的錯誤,對未知的情況無法處理;程序可讀性差,大量的錯誤處理代碼混雜在程序中;出錯返回信息量太少,無法更確切地了解錯誤狀況或原因。
1異常的概念用常規(guī)方法處理錯誤存在的主要問題有:1異常的概念631異常的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓绦蛑械姆菄乐劐e誤,在Java中,非嚴重錯誤被稱為異常(Exception)。在一個方法的運行過程中,如果發(fā)生了異常,則這個方法(或者是Java虛擬機)生成一個代表該異常的對象(包含了該異常的詳細信息),并把它交給運行時系統(tǒng),運行時系統(tǒng)尋找相應(yīng)的代碼來處理這一異常。我們把生成異常對象并把它提交給運行時系統(tǒng)的過程稱為拋棄(throw)一個異常。運行時系統(tǒng)在方法的調(diào)用棧中查找,從生成異常的方法開始進行回朔,直到找到包含相應(yīng)異常處理的方法為止,這一個過程稱為捕獲(catch)一個異常。1異常的概念Java通過面向?qū)ο蟮姆椒▉硖幚?41異常的概念
用異常的形式處理錯誤:{
try{
openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}
catch(fileopenFailed) {dosomething;}
catch(sizeDetermineFailed) {dosomething;}
catch(memoryAllocateFailed) {dosomething;}
catch(readFailed) {dosomething;}
catch(fileCloseFailed) {dosomething;}
finally {dosomething;}}1異常的概念用異常的形式處理錯誤:652異常處理
6.2.1Java中的Throwable類
Java中的所有異常都是由Throwable類的子類生成的對象,所有的異常類都是Throwable類的子類或子類的子類。下圖給出了部分Java中部分錯誤類、異常類的繼承關(guān)系。2異常處理6.2.1Java中的Throwable66根據(jù)程序?qū)﹀e誤與異常的處理方式,可以將Java中的異常分為兩類:
Error:是一些嚴重的程序不能處理的系統(tǒng)錯誤類
,包括內(nèi)存溢出、動態(tài)鏈接失敗、虛擬機錯誤等,Java程序不做處理。
Exception:一般程序中可預(yù)知的問題,其產(chǎn)生的異??赡軙硪庀氩坏降慕Y(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常。2異常處理根據(jù)程序?qū)﹀e誤與異常的處理方式,可以將Java中的異常分為兩672異常處理ThrowableErrorExceptionRuntimeException缺省的異常處理程序由用戶捕獲或聲明并處理不做處理用戶自己產(chǎn)生的異常處理2異常處理ThrowableErrorExceptionR682異常處理
——一些常用的異常類Error(allinjava.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)…2異常處理Error(allinjava.lang)69Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException2異常處理
——一些常用的異常類Exception(injava.lang)2異常處理70RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)…2異常處理
——一些常用的異常類RuntimeException2異常處理71ExceptionIOException(injava.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOExceptionStreamCorruptedExceptionJ.MalformedURLException……2異常處理
——一些常用的異常類Exception2異常處理72
異常示例:(1)編譯時異常:在程序中必須對其進行處理,否則編譯器會指出錯誤。在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運行時異常:程序中可以不做處理,直接由運行時系統(tǒng)來處理。2異常處理異常示例:2異常處理73try-catch-finally語句
Java的異常處理是通過3個關(guān)鍵詞來實現(xiàn)的:try-catch-finally。用try來監(jiān)視執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)就會拋出(throws)異常,可以通過異常的類型來捕捉(catch)并處理它,或最后(finally)由缺省處理方法來處理。2異常處理-捕獲異常try-catch-finally語句2異常處理-捕獲異74try代碼段包含可能產(chǎn)生異常的代碼try代碼段后跟有一個或多個catch代碼段每個catch代碼段聲明其能處理的一種特定類型的異常每個catch代碼段都是一段異常處理代碼程序繼續(xù)執(zhí)行最后一個catch代碼段后的代碼
(或執(zhí)行完finally代碼段后)不同的代碼段是不同的作用域,不可訪問相互之間定義的局部變量try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生
//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標識符){//處理異常;}catch(要處理的異常種類和標識符){//處理異常;}…finally{//最終處理(缺省處理);}…//OtherStatements2異常處理-捕獲異常try代碼段包含可能產(chǎn)生異常的代碼try{2異常處理-捕獲752異常處理-捕獲異常try語句
捕獲異常的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理異常的范圍。在執(zhí)行過程中,該段代碼可能會產(chǎn)生并拋棄一個或多個異常,因此,它后面的catch語句進行捕獲時也要做相應(yīng)的處理。
如果沒有異常產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。2異常處理-捕獲異常try語句762異常處理-捕獲異常catch語句每個try語句必須伴隨一個或多個catch語句,用于捕獲try代碼塊所產(chǎn)生的異常并做相應(yīng)的處理。catch語句有一個形式參數(shù),用于指明其所能捕獲得異常類型,運行時系統(tǒng)通過參數(shù)值把被拋棄的異常對象傳遞給catch語句。程序設(shè)計中要根據(jù)具體的情況來選擇catch語句的異常處理類型,一般應(yīng)該按照try代碼塊中異??赡墚a(chǎn)生的順序及其真正類型進行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當(dāng)然也可以用一個catch語句處理多個異常類型,這時它的異常類型應(yīng)該是這多個異常類型的父類,但這種方式使得在程序中不能確切判斷異常的具體類型。2異常處理-捕獲異常catch語句77publicclassL4_02{publicstaticvoidmain(String[]args){inta,b,c;a=9;b=0;c=a/b;System.out.println(a+"/"+b+"="+c);}}沒有捕獲異常publicclassL4_02{沒有捕獲異常78運行結(jié)果Exceptioninthread"main"java.lang.ArithmeticException:/byzeroat異常處理.L4_02.main(L4_02.java:7)運行結(jié)果Exceptioninthread"main"79//處理被除數(shù)為0產(chǎn)生的異常舉例,Li4_01.javapublicclassLi4_01{publicstaticvoidmain(Stringargs[]){inta,b,c;try{ a=9; b=0; c=a/b; System.out.println(a+"/"+b+"="+c);}catch(ArithmeticExceptione){ System.out.println("出現(xiàn)被0除的異常情況");}System.out.println("java程序運行結(jié)束!");}}
//處理被除數(shù)為0產(chǎn)生的異常舉例,Li4_01.java80運行結(jié)果出現(xiàn)被0除的異常情況java程序運行結(jié)束!運行結(jié)果出現(xiàn)被0除的異常情況812異常處理-捕獲異常
finally語句捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。
無論try所指定的程序塊中是否拋出異常,也無論catch語句的異常類型是否與所拋棄的異常的類型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。通常在finally語句中可以進行資源的清除工作,如關(guān)閉打開的文件、刪除臨時文件等。2異常處理-捕獲異常finally語句82try{
in=newFileInputStream(“file1.txt”);
對文件進行處理的程序;}catch(IOExceptione){//對文件異常進行處理;}finally{//不論是否發(fā)生異常,都關(guān)閉文件;}finally在文件處理時非常有用
異常的覆蓋
finally代碼段中應(yīng)該把可能產(chǎn)生異常的語句用try-catch保護起來if(in!=null){try{in.close();}catch(IOExceptione){…}}//用try-catch結(jié)構(gòu),防止finally代碼段拋出異常try{finally在文件處理時非常有用異常的覆蓋if83throw和throws語句
如果在一個方法中生成了異常,但是該方法并不處理它產(chǎn)生的異常,而是沿著調(diào)用層次向上傳遞,交由調(diào)用它的方法來處理這些異常,這就是聲明異常。
2異常處理throw和throws語句2異常處理84publicvoidmethod1(){
intx;try{System.out.print("Inputx:");Scannersc=newScanner(System.in);x=sc.nextInt();intz=compute(x);System.out.println("z="+z);}catch(ArithmeticExceptione){System.out.println("devidedby0");}}publicintcompute(intx)throwsArithmeticException{intz=100/x;returnz;}method1compute異常異常拋出處理調(diào)用publicvoidmethod1()publicin85非運行時異常Throwable、Exception運行時異常Error、RuntimeException當(dāng)在一個方法的代碼中拋出一個受檢查的異常時,這個異?;蛘弑环椒ㄖ械膖ry-catch結(jié)構(gòu)捕獲,或者在方法的throws語句中聲明編譯器檢查程序,保證所有非運行時異常都被程序顯式地處理ThrowableErrorExceptionRuntimeException2異常處理非運行時異常ThrowableErrorExceptionR862異常處理
聲明異常首先必須生成異常。前面所提到的異?;蛘呤怯蒍ava虛擬機生成,或者是由Java類庫中的某些類生成。事實上,我們在程序中也可以生成自己的異常對象,也即是異常可以不是出錯產(chǎn)生,而是人為地拋出。不論那種方式,生成異常對象都是通過throw語句實現(xiàn):
thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;
注意:拋出的異常必須是Throwable或其子類的實例。2異常處理聲明異常首先必須生成異常。前面所提到的異87任何從Throwable派生的類都可以用throw語句拋出,拋出異常用來表明程序遇到的錯誤無法正常執(zhí)行而需要異常處理thrownewMyException(“someinfomation”);異??梢杂蓆ry代碼段中的語句拋出也可以從被try代碼段中調(diào)用的方法中拋出異常還可能產(chǎn)生于數(shù)組下標越界以及Java虛擬機內(nèi)部錯誤等Exception和Error是Throwable的直接派生類Exception,程序應(yīng)該處理的異常Error代表系統(tǒng)嚴重錯誤,一般程序不處理這類錯誤異常拋出點后的代碼在拋出異常后不再執(zhí)行也可以說異常的拋出終止了代碼段的執(zhí)行2異常處理任何從Throwable派生的類都可以用throw語句拋出,883自定義異常處理類
當(dāng)我們在設(shè)計自己的類包時,應(yīng)盡最大的努力為用戶提供最好的服務(wù),并且希望用戶不要濫用我們所提供的方法,當(dāng)程序出現(xiàn)某些異常事件時,我們希望程序足夠健壯以從程序中恢復(fù),這時就需要用到異常。在選擇異常類型時,可以使用Java類庫中已經(jīng)定義好的類,也可以自己定義異常類。自定義異常類不是由Java系統(tǒng)監(jiān)測到的異常(如數(shù)組下標越界,被0除等),而是由用戶自己定義的異常。自定義異常同樣要用try-catch-finally捕獲,但必須由用戶自己拋出(throw)。3自定義異常處理類當(dāng)我們在設(shè)計自己的類包時,89
異常是一個類,自定義異常必須繼承自Throwable或Exception類。建議:
異常一定是不經(jīng)常發(fā)生的故障,應(yīng)避免把控制流程作為異常處理。盡量使用JDK提供的異常類:重用、便于理解。用Exception/RuntimeException類:編譯時異常、運行時異常。一般不把自定義異常作為Error的子類,因為Error通常被用來表示系統(tǒng)內(nèi)部的嚴重故障。ThrowableErrorExceptionRuntimeException自定義異常處理異常是一個類,自定義異常必須繼承自Throwabl903自定義異常處理類
當(dāng)自定義異常是從RuntimeException及其子類繼承而來時,該自定義異常是運行時異常,程序中可以不捕獲并處理它。當(dāng)自定義異常是從Throwable、Exception及其其他子類繼承而來時,該自定義異常是編譯時異常,也即程序中必須捕獲并處理它。自定義異常的形式:classMyExceptionextendsException{…}3自定義異常處理類當(dāng)自定義異常是從RuntimeE913自定義異常處理類
例1:計算兩個數(shù)之和,當(dāng)任意一個數(shù)超出范圍(本例為10~20)時,拋出自己的異常。publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}3自定義異常處理類例1:計算兩個數(shù)之和,當(dāng)任意92public
classAddTwoNumber{public
static
intCalcAnswer(Stringstr1,Stringstr2)throwsNumberRangeException{
intint1,int2;
intanswer=-1;
try{int1=Integer.parseInt(str1);int2=Integer.parseInt(str2);
if((int1<10)||(int1>20)||(int2<10)||(int2>20)){
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024建筑工程材料采購的合同
- 2024成都二手房產(chǎn)買賣交易協(xié)議
- 2024年版私房菜廚師合作經(jīng)營協(xié)議3篇
- 2024中介行業(yè)二手房買賣合同規(guī)范模板3篇
- 2025年度寫字樓租賃合同補充協(xié)議3篇
- 2024年酒店服務(wù)與供貨合同
- 2025年度長沙離婚后子女撫養(yǎng)權(quán)及生活費支付協(xié)議3篇
- 2024建筑鋼管租賃合同模板
- 2024版簡易離婚合同書寫范例版B版
- 2024年酒店多功能廳租賃協(xié)議標準文本一
- 河南近10年中考真題數(shù)學(xué)含答案(2023-2014)
- 八年級上學(xué)期期末家長會課件
- 2024年大學(xué)試題(宗教學(xué))-佛教文化歷年考試高頻考點試題附帶答案
- 軟件項目服務(wù)外包工作管理辦法
- 紅薯系列產(chǎn)品項目規(guī)劃設(shè)計方案
- 人教版九年級上冊化學(xué)默寫總復(fù)習(xí)
- 無人機地形匹配導(dǎo)航
- 2023-餐飲公司章程范本
- 我國地方政府債務(wù)風(fēng)險及其防范研究的開題報告
- 靜脈治療護理質(zhì)量考核評價標準
- 神經(jīng)內(nèi)科應(yīng)急預(yù)案完整版
評論
0/150
提交評論