




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
異常處理異常異常的概念異常的分類捕獲異常聲明異常拋出異常創造自己的異常總結異常處理
異常的概念什么是異常?
異常實際上是程序中錯誤導致中斷了正常的指令流的一種事件.沒有處理錯誤的程序:
read-file{openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}異常處理異常的概念以常規方法處理錯誤
openFiles;if(the){determinethelenthofthefile;if(gotThe){allocatethatmuchmemory;if(gotEnoughMemory){readthememory;if(readFailed)errorCode=-1;elseerrorCode=1;}elseerrorCode=-3;}elseerrorCode=-5;}elseerrorCode=-5;異常處理
異常的概念觀察前面的程序你會發現大部分精力花在出錯處理上了.只把能夠想到的錯誤考慮到,對以外的情況無法處理程序可讀性差出錯返回信息量太少異常處理
異常的概念用異常的形式處理錯誤read-File;{try{
openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}catch(){dosomething;}catch(sizeDetermineFailed){dosomething;}catch(memoryAllocateFailed){dosomething;}catch(readFailed){dosomething;}catch(){dosomething;}catch(Exception){dosomething;}//其它未考慮到的錯誤
}異常處理異常的概念和傳統的方法比較異常的優點:1.把錯誤代碼從常規代碼中分離出來2.把錯誤傳播給調用堆棧3.按錯誤類型和錯誤差別分組4.系統提供了對于一些無法預測的錯誤的捕獲和處理5.克服了傳統方法的錯誤信息有限的問題method1method2method3method4探測拋出例外傳遞捕獲處理例外調用異常處理什么情況下使用例外機制?當方法因為自身無法控制的原因而不能完成其任務文件不存在,網絡連接無法建立……處理在方法、類庫、類中拋出的例外如產生IOException在大的項目中采用統一的方式處理例外時如編寫一個文字處理器例外應該是不經常發生但卻可能發生的故障一定發生的事件不應該用例外機制來處理例外處理用于使系統從故障中恢復提示信息/不產生無效的結果/釋放資源異常的概念異常處理不同的例外處理策略關鍵性應用(處理所有例外)實驗軟件(可以忽略許多例外)處理例外時的注意事項終止程序會導致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯誤不要使用例外機制例外機制的處理比正常處理效率低異常的概念異常處理
異常的概念.classExcepTest{publicvoidmain(Stringargs[]){intb=0;inta;try{a=5/b;}catch(ArithmeticExceptione){System.out.println(“dividedby0”);}}}try{URLurl=newURL(”,”hit.gif”);}catch(MalformedURLExceptione){badURL=true;repaint();}異常處理異常的分類異常是一個對象,它繼承自Throwable類,所有的Throwable類的子孫類所產生的對象都是例外.Error:由Java虛擬機生成并拋出,Java程序不做處理.RuntimeException(被0除等系統錯誤,數組下標超范圍):由系統檢測,用戶的Java程序可不做處理,系統將它們交給缺省的異常處理程序.Exception(程序中的問題,可預知的):Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常throw:用戶自己產生異常異常處理異常的分類異常處理異常的分類.ThrowableErrorExceptionRuntimeException缺省的異常處理程序由用戶捕獲或聲明并處理不做處理用戶自己產生的異常要處理異常處理例外的分類
一個例外是由一個對象來代表的,所有的例外都直接或間接地繼承自Throwable類。在Java類庫的每個類包中都定義了例外類,這些例外類分成兩大類:Error類及Exception類,后者是Java程序中需要大量處理的。除了Java類庫所定義的例外類之外,用戶也可以通過繼承已有的例外類來定義自己的例外類,并在程序中使用(利用throw產生,throws聲明拋出,catch捕捉并處理)。異常處理
Error:由Java虛擬機生成并拋出,包括動態鏈接失敗、虛擬機錯誤等,Java程序不做處理。
RuntimeException:Java虛擬機在運行時生成的例外,如被0除等系統錯誤、數組下標超范圍等,其產生比較頻繁,處理麻煩,對程序可讀性和運行效率影響太大。因此由系統檢測,用戶可不做處理,系統將它們交給缺省的異常處理程序(當然,必要時,用戶可對其處理)。
Exception:一般程序中可預知的問題,其產生的例外可能會帶來意想不到的結果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常。例外的分類異常處理publicstaticvoidmain(String[]args){try{testThrowable();}catch(Throwablet){System.err.println(t.toString());System.err.println(t.getMessage());System.err.println(t.getLocalizedMessage());
t.printStackTrace();}}…staticvoidtestThrowable()throwsThrowable{
thrownewThrowable("測試Throwable的用法。");}java.lang.Throwable:測試Throwable的用法。測試Throwable的用法。測試Throwable的用法。java.lang.Throwable:測試Throwable的用法。
attest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)異常處理publicstaticvoidmain(String[]args){try{
testThrowable();}catch(Throwablet){System.err.println(t.toString());System.err.println(t.getMessage());System.err.println(t.getLocalizedMessage());
t.printStackTrace(System.err);}}…staticvoidtestThrowable()throwsThrowable{
thrownewThrowable();}java.lang.Throwablenullnulljava.lang.Throwableattest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)異常處理
例外示例:(1)編譯時例外:在程序中必須對其進行處理,否則編譯器會指出錯誤。
在使用能夠產生異常的方法而沒有捕獲和處理,程序將不能通過編譯。(2)運行時例外:程序中可以不做處理,直接由運行時系統來處理。例外的分類異常處理捕獲異常捕獲并處理異常try{//接受監視的程序塊,在此區域內發生
//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標識符){//處理異常;}catch(要處理的異常種類和標識符){//處理異常;}異常處理捕獲例外try語句
捕獲例外的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執行過程中,該段代碼可能會產生并拋棄一個或多個例外,因此,它后面的catch語句進行捕獲時也要做相應的處理。
如果沒有例外產生,所有的catch代碼段都被略過不執行。異常處理捕獲例外catch語句每個try語句必須伴隨一個或多個catch語句,用于捕獲try代碼塊所產生的例外并做相應的處理。catch語句有一個形式參數,用于指明其所能捕獲得例外類型,運行時系統通過參數值把被拋棄的例外對象傳遞給catch語句。程序設計中要根據具體的情況來選擇catch語句的例外處理類型,一般應該按照try代碼塊中例外可能產生的順序及其真正類型進行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當然也可以用一個catch語句處理多個例外類型,這時它的例外類型應該是這多個例外類型的父類,但這種方式使得在程序中不能確切判斷例外的具體類型。異常處理catch(Exceptione)
捕獲所有Exceptioncatch(Throwablet)
捕獲Exception和Error例外總是由距離產生例外最近的匹配catch代碼段處理如果沒有相應的例外處理,則例外被交給上一層try代碼段進行處理例外處理的查找依據類型匹配原則順序進行第一個匹配的例外處理被執行,當例外處理執行完畢,程序接著最后一個catch代碼段后的語句執行例外處理的順序影響到例外的處理子類例外可被父類例外處理捕獲不要先捕獲父類例外,再捕獲子類例外如果找不到相應的例外處理非GUI程序將結束程序執行;Applet或GUI程序則回復到事件處理狀態捕獲例外
——catch語句異常處理捕獲例外
——catch語句盡量避免用一般類型作為catch中指定要捕獲的類型。一般應該按照try代碼塊中例外可能產生的順序及其真正類型進行捕獲和處理,在例外處理中無法訪問try代碼段中聲明的變量因為此時try代碼段已經退出了,例外處理所需要的任何信息一般都應該通過例外對象來傳遞在使用方法時盡量直接處理該方法可能產生的例外這樣你的程序就會更健壯在使用庫方法之前,應該先仔細閱讀說明文檔那里會介紹方法可能產生的例外以及例外產生的條件在使用各種例外類之前也應該先仔細閱讀說明文檔那里會介紹例外的具體含義及例外產生的條件異常處理在catch代碼段中產生的例外不是由相同try的后續catch代碼段處理,而是由包含整個try-catch結構的上層try代碼段檢測并處理可以把catch到的例外對象再次拋出,使上層try-catch結構繼續處理該例外事件;也可以把例外對象轉換為其它例外對象…catch(Exceptione){throwe;}try-catch機制不該被用于流程控制,例外情形應該是很稀少的,而不是經常性的在catch代碼段中的return語句用于退出方法,而不是返回到例外拋出點(throwpoint)捕獲例外
——catch語句異常處理
捕獲異常常見的異常ArithmeticException//算術異常比如被零除ArrayIndexOutOfBoundsException//數組下標越界ArrayStoreException//放入數組的類型不符IOException//I/O異常//找不到文件異常NullPointerException//空指針異常MalformedURLException//url無法解析異常NumberFormatException//字符串轉換數值異常如果在使用能夠產生異常的方法而沒有捕獲和處理,將不能通過編譯異常處理
捕獲異常例:編寫Java程序,包含三種異常算術異常,字符串越界,數組越界觀察輸出信息:每個異常對象可以直接給出信息異常處理捕獲異常classfirst_exception{ publicstaticvoidmain(Stringargs[]) {charc;inta,b=0;int[]array=newint[7];Strings="Hello";
try{a=1/b;}catch(ArithmeticExceptionae){System.out.println(“Catch“+ae));}try{array[8]=0;}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println((“Catch“+ai);}
try{c=s.charAt(8));}catch(StringIndexOutOfBoundsExceptionse){System.out.println((“Catch“+se);}}}異常處理
捕獲異常一定會執行的程序塊---finally異常處理的統一出口try{//常規的代碼;}catch(){//處理異常}finally{//不論發生什么異常(或者不發生任何異常),都要執行的部分;}異常處理捕獲例外finally語句捕獲例外的最后一步是通過finally語句為例外處理提供一個統一的出口,使得在控制流程轉到程序的其他部分以前,能夠對程序的狀態作統一的管理。
無論try所指定的程序塊中是否拋出例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執行,它提供了統一的出口。(finally語句與switch中的default語句是不同的!)通常在finally語句中可以進行資源的清除工作,如關閉打開的文件、刪除臨時文件等。異常處理
聲明異常一個方法不處理它產生的異常,而是沿著調用層次向上傳遞,由調用它的方法來處理這些異常,叫聲明異常.聲明異常的方法在產生異常的方法名后面加上要拋出(throws)的異常的列表voidcompute(intx)throwsArithmeticException{…}returnTypemethodName([parameterlist])throwsexceptionList異常處理
聲明異常例:若因某種原因不想在創建URL的方法中處理異常publicmethod1(){intx;try{x=System.in.read();compute(x);}catch(IOExceptionioe){System.out.println(“readerror”);}catch(ArithmeticExceptione){System.out.println(“devidedby0”);}}publicintcompute(intx)throwsArithmeticExceptione){returnz=100/x;}異常處理聲明異常method1computer異常拋出處理異常處理
聲明異常例:說出程序執行結果publicclassexception1{voidProc(intsel)throwsArithmeticException,ArrayIndexOutOfBoundsException{System.out.println(“InSituation"+sel);if(sel==0){System.out.println("noExceptioncaught");return;}elseif(sel==1){intiArray[]=newint[5];iArray[10]=3;}}異常處理聲明異常publicstaticvoidmain(Stringargs[]){try{Proc(0);Proc(1);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Catch"+e);}}
c:>javathrowsExceptionInSituation0noExceptioncaughtInSituation1Catchjava.lang.ArrayIndexOutOfBoundsException:10異常處理
拋出異常拋棄異常:不是出錯產生,而是人為地拋出throwThrowableObject;thrownewArithmeticException();例:編寫程序人為拋出(JavaThrow.prj)ArithmeticException,ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionAmethodExceptionAnothermethodthrowcaught異常處理
拋出異常classJavaThrow{ publicstaticvoidmain(Stringargs[]) {try{thrownewArithmeticException();}catch(ArithmeticExceptionae){System.out.println(ae);}try{thrownewArrayIndexOutOfBoundsException();}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println(ai);}try{thrownewStringIndexOutOfBoundsException();}catch(StringIndexOutOfBoundsExceptionsi){{System.out.println(si);}異常處理任何從Throwable派生的類對象都可以用throw語句拋出,拋出例外用來表明程序遇到的錯誤無法正常執行而需要例外處理thrownewMyException(“someinfomation”);例外可以由try代碼段中的語句拋出也可以從被try代碼段中調用的方法中拋出例外還可能產生于數組下標越界以及Java虛擬機內部錯誤等Exception和Error是Throwable的直接派生類Exception,程序應該處理的例外Error代表系統嚴重錯誤,一般程序不處理這類錯誤例外拋出點后的代碼在拋出例外后不再執行也可以說例外的拋出終止了代碼段的執行拋出例外(throw語句)異常處理
創造自己的異常不是由Java系統監測到的異常(下標越界,被0-除等),而是由用戶自己定義的異常.用戶定義的異常同樣要用try--catch捕獲,但必須由用戶自己拋出thrownewMyException.異常是一個類,用戶定義的異常必須繼承自Throwable或Exception類,建議用Exception類.異常處理
創造自己的異常形如:classMyExceptionextendsException{….};例1:計算兩個數之和,當任意一個數超出范圍時,拋出自己的異常publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}異常處理publicintCalcAnswer(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;}cat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息系統監理知識體系整合試題及答案
- 考生常見疑問試題及答案
- 網絡服務的管理與優化策略試題及答案
- 嵌入式系統與企業發展試題及答案
- 嵌入式技術領域的基礎知識試題及答案
- 數據存儲技術實踐中的考試題及答案
- 2025年軟件設計師考試大趨勢試題及答案
- 2025年機電工程在線學習平臺的崛起試題及答案
- 研討學習數據庫試題及答案
- 機電工程節能減排試題及答案
- 教學能力比賽學情分析圖(源圖可編輯)
- 幼兒園2024-2025學年保教工作計劃
- 燕舞集團招聘試題
- 小學心理健康教育《積極心態(1)》優質課教案、教學設計
- 甬統表(工程表格全套)
- 軟件架構與系統穩定性
- DB21-T 2819-2017巖土工程勘察報告編制規范
- 夜市規劃方案范文
- 2024年新蘇教版五年級下冊科學全冊精編知識點(附附問答題)
- 護理技術操作常見并發癥處理及預防規范課件
- 疼痛科進修總結匯報
評論
0/150
提交評論