版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Java語言與JBuilder應用初步第七章 異常處理,,回顧,字符串類Math類Object類數(shù)組類,本章要點,異常處理的基本概念異常的捕獲標準Java異常,異常處理的基本概念,異常處理機制的作用在編程中,錯誤總是難免會發(fā)生的關鍵在于發(fā)生錯誤之后,能否捕獲錯誤,如何捕獲錯誤,程序能否從錯誤中恢復異常處理的目的,不是要避免異常,而是在異常發(fā)生時,設法使損失降低到最小,異常處理的基本概念,錯誤與異常錯誤:編譯程序
2、時發(fā)現(xiàn)的問題,編譯時會出現(xiàn)錯誤或警告。當運行程序時,錯誤已經(jīng)不存在異常:編譯時沒有發(fā)現(xiàn),只有在運行程序的時候,在某種特定的情況下,程序執(zhí)行出現(xiàn)錯誤,這時會發(fā)生異常,異常處理的基本概念,例1,算術異常:語句:“y = a / b + c;”,y, a, b, c都是整型變量;如果b = 0,則程序停止運行,拋出算術異常:Exception in thread "main" java.lang.Arithmeti
3、cException: / by zero at ExceptDemo1.main(ExceptDemo1.java:3)例2,數(shù)組下標越界異常:數(shù)組myArray只能容納10個元素如果訪問第11個元素:“i = 10; myArray[i] = 3;”則程序停止運行,拋出數(shù)組下標越界異常:Exception in thread "main" java.lang.ArrayIndexOutO
4、fBoundsException: 10 at ExceptDemo1.main(ExceptDemo1.java:6),異常處理的基本概念,異常的特點編譯時不能發(fā)現(xiàn),有些非常隱蔽,很難發(fā)現(xiàn)一旦出現(xiàn)異常,程序就無法繼續(xù)執(zhí)行下去異常處理的目的在發(fā)生異常時,處理好一些相關善后事宜,例如保存文檔、刪除錯誤的數(shù)據(jù)庫記錄等如果異常僅僅是在局部發(fā)生,可以僅僅停止執(zhí)行這條命令,而讓整個程序繼續(xù)正常運行,異常的捕獲,通過try
5、 ... catch塊捕獲異常try { . . . // 可能會發(fā)生異常的程序塊}catch (Type1 id1) { . . . // 處理類型1的異常}catch (Type2 id2) { . . . // 處理類型2的異常},異常的捕獲,通過try ... catch塊捕獲異常try將一塊可能發(fā)生異常的代碼包起來執(zhí)行這段代碼時,一旦出現(xiàn)異常,就跳出try塊,而進入后面的catch部分逐一比較異常
6、類型是否與catch中的異常類型相符,如果符合,則進入catch塊內的異常處理程序最后跳出整個try-catch塊,異常的捕獲,通過try ... catch塊捕獲異常在比較異常類型的過程中,如果有一個catch塊的異常類型與之相符,Java就會停止繼續(xù)比較,直接進入這個catch塊的異常處理程序在處理完之后,不會繼續(xù)比較其它catch塊,也不會繼續(xù)執(zhí)行異常發(fā)生點后面的程序,而是跳出整個try-catch塊,執(zhí)行后面的語句如果程
7、序正常運行,則不執(zhí)行所有catch塊中的程序內容,異常的捕獲,異常的類型異常的類型是通過異常類來描述的異常類是一種特殊的類,平時并不出現(xiàn)在發(fā)生異常時,Java會自動產(chǎn)生一個異常對象,并把它“拋出”try塊之外拋出的try對象與各個catch塊進行匹配匹配原則:如果拋出的異常對象屬于catch塊里的異常類,或者屬于該異常類的子類,則認為異常對象與catch塊匹配,異常的捕獲,異常處理例題分析源程序和正常運行時的結果見教材產(chǎn)生
8、一個算術異常:將第4行改為:“int b = 0;”此時第6行的a/b沒有意義程序運行到第6行時,“a/b”命令出現(xiàn)錯誤,系統(tǒng)拋出算術異常,并且中止程序。后續(xù)的給myArray數(shù)組賦值、顯示等工作,雖然與變量b毫無關系,也被迫中止了。,異常的捕獲,捕獲算術異常以后的結果修改的部分源代碼 try { System.out.println("a/b的值是:" + a/b); } c
9、atch (ArithmeticException e) { System.out.println("程序出現(xiàn)異常,變量b不能為0。"); }程序運行到a/b時,會擲出一個算術異常對象,它符合catch語句,于是執(zhí)行catch內的代碼,在屏幕上提示“變量b不能為0”程序繼續(xù)執(zhí)行下去,完成給數(shù)組賦值、顯示等工作,最后顯示“程序執(zhí)行順利結束”,異常的捕獲,捕獲數(shù)組下標越界異常以后的結果修改的部分
10、源代碼 try { for (int i=0; i<=myArray.length; i++) { myArray[i] = i *3; System.out.println("myArray數(shù)組的第" + i + "個元素的值是:" + myArray[i]); } } catch (ArrayIndexOutOfBound
11、sException e) { System.out.println("數(shù)組下標越界。"); }當數(shù)組的下標超出范圍時,系統(tǒng)拋出下標越界異常對象,catch結構中捕獲了這個異常,并在屏幕上顯示“數(shù)組下標越界”,程序繼續(xù)執(zhí)行,直到全部執(zhí)行完畢,異常的捕獲,異常與捕獲對象不匹配的情況在上面的try塊中加入如下代碼: System.out.println("被0除錯誤
12、。" + 12/0);當運行到這條語句時,try捕獲了一個算術異常,但catch塊只能匹配下標越界異常,因此只能中斷程序,提示出錯,異常的捕獲,異常與捕獲對象不匹配的解決辦法第1種辦法:增加一個catch塊,捕獲算術異常第2種方法:捕獲更加通用的運行期異常 catch (ArrayIndexOutOfBoundsException e) { System.out.println("數(shù)組
13、下標越界。"); } catch (RuntimeException e) { System.out.println("程序出現(xiàn)運行期異常。"); }RuntimeException包括運行時各種常見的異常,因此大部分異常都能在這里捕獲并進行處理。運行期異常應當放在最后,否則會覆蓋了其它的特定異常處理,異常的捕獲,finally塊表示無論是否出現(xiàn)異常,都應當執(zhí)行的內容完整的
14、try ... catch ... finally塊結構:try { . . . // 可能會發(fā)生異常的程序塊 }catch (Type1 id1) { . . . // 處理類型1的異常 }catch (Type2 id2) { . . . // 處理類型2的異常 }finally { . . . // 不管是否發(fā)生異常,最后都應處理的程序塊 },異常的捕獲,finally塊的功能與其它編程語言不同,Java
15、中會自動回收無用對象,因此在finally塊中不需要回收已分配的內存主要的工作是關閉已打開的文件,關閉數(shù)據(jù)庫連接,清除在屏幕上顯示的內容等注意:程序正常運行時也會執(zhí)行finally塊中的內容,因此finally塊中的程序既要滿足正常執(zhí)行的需要,也要滿足出現(xiàn)異常時的需要,異常的捕獲,自定義異常第1步:建立自己的異常類所有的異常類都繼承自Exception類創(chuàng)建一個異常類,只要繼承Exception類,再給出兩個構造函數(shù)即可cl
16、ass MyException extends Exception { public MyException() {} public MyException(String msg) { super(msg); }},異常的捕獲,第1步:建立自己的異常類第1個構造函數(shù)用于生成一個缺省的異常對象第2個構造函數(shù)在生成異常對象時還給出描述異常原因的字符串字符串可以用異常類繼承自父類的getMessage()函數(shù)得到Ex
17、ception類中已經(jīng)給出了恰當?shù)奶幚懋惓W址姆椒?,因此?個構造函數(shù)中直接調用父類的相應構造函數(shù)就可以了,異常的捕獲,第2步:拋出并捕獲自定義異常Java系統(tǒng)不會自動拋出自定義異常,因為Java不知道什么時候需要拋出它,因此我們只能手動拋出異常利用throw關鍵字產(chǎn)生一個新的異常對象,隨后拋出該異常,正常的程序執(zhí)行中斷 throw new MyException();用throw產(chǎn)生異常對象時,可給出異常原因
18、 throw new MyException("自定義異常,異常原因為……");,異常的捕獲,第2步:拋出并捕獲自定義異常用try ... catch塊捕獲自定義異常try { . . . // 其中包括拋出自定義異常的語句}catch (MyException e) { String errStr; errStr = e.getMessage(); System.out.println
19、(errStr); }catch塊捕獲類型相配的自定義異常,利用getMessage函數(shù)獲得描述字符串,并顯示在屏幕上,異常的捕獲,從函數(shù)中拋出異常try ... catch塊只能在函數(shù)內部處理異常有時函數(shù)本身不能處理所有的異常例如傳遞給函數(shù)的參數(shù)不正確,就將異常拋出函數(shù)外,由調用它的主程序處理在函數(shù)定義部分利用throws關鍵字定義可以拋出異常void myFunc() throws ArithmeticException
20、, MyException { . . . // 函數(shù)主體},異常的捕獲,從函數(shù)中拋出異?!}演示源代碼與正常情況下的運行結果見教材從函數(shù)中拋出算術異常:將b的值設為0,在minus函數(shù)的內部造成一個除以0的異常minus函數(shù)的內部沒有try ... catch結構,但在函數(shù)定義部分將算術異常類導出到函數(shù)外因此minus函數(shù)將算術異常拋出,被主程序里的try ... catch結構捕獲,屏幕顯示“除數(shù)b為0?!?異常
21、的捕獲,從函數(shù)中拋出自定義異常:將a的值設為3000在minus函數(shù)中,當a大于2000的時候,程序就會拋出一個自定義的MyException異常這個異常也同樣傳到了函數(shù)外,被主程序的try ... catch結構捕獲顯示“程序出現(xiàn)自定義異常MyException”,然后顯示描述異常原因的字符串“參數(shù)a過大”不管是程序正常執(zhí)行,還是拋出異常,最后都要執(zhí)行finally塊中的內容,異常的捕獲,必須處理的異常所有的異常必須進行處
22、理,或者在try ... catch結構中捕獲,或者用throws拋出例:在minus函數(shù)里,如果一個異常沒有在try ... catch結構捕獲,又沒有通過throws關鍵字導出,則會出現(xiàn)編譯錯誤ExceptDemo2.java:4: unreported exception MyException; must be caught or declared to be thrown throw new MyExcept
23、ion("參數(shù)a過大。");,異常的捕獲,運行期異常的特點在例題中,刪除minus對算術異常的拋出:int minus(int a, int b) throws MyException { ... }將a的值設為500,b的值設為0,以引發(fā)一個算術異常,運行結果如下:,異常的捕獲,運行期異常的特點編譯和運行時沒有報錯算術異常自動導出,然后被主函數(shù)中的try ... catch結構捕獲算術異常類是運行期異常
24、類的一個子類,而Java默認自動拋出所有的運行期異常數(shù)組下標越界異常也是運行期異常的一個子類,因此它也是自動拋出的,異常的捕獲,運行期異常的特點Java默認自動拋出所有的運行期異常如果有try ... catch塊,則運行期異常被try ... catch塊捕獲如果沒有try ... catch塊,運行期異常被拋出至主程序外,由Java系統(tǒng)自動處理非運行期異常類必須要手動用try ... catch塊捕獲,或用throws關鍵
25、字拋出,標準Java異常,異常類的繼承關系Throwable類是所有錯誤和異常的父類只有由它繼承來的類才能被Java系統(tǒng)或throw拋出只有由它繼承來的類才能被catch子句捕獲Throwable的直接子類:Error和ExceptionError類包括了嚴重錯誤,一般不應當捕獲它Exception類是所有異常類的父類,如果在catch結構中放入Exception類,那么它可以捕獲到所有的異常,標準Java異常,Except
26、ion類的直接子類:ClassNotFoundException:沒有找到類CloneNotSupportedException:不支持復制IllegalAccessException:沒有權限訪問InstantiationException:不能創(chuàng)建對象InterruptedException:線程受到打擾NoSuchFieldException:沒有該成員變量NoSuchMethodException:沒有該成員函數(shù)
27、RuntimeException:運行期異常,標準Java異常,Exception類的直接子類大部分子類在正常情況下都很少出現(xiàn)僅適用于用特殊的方法,躲開了編譯器的語法檢查的情況最后一個子類:RuntimeException(運行期異常)類非常重要它包括了幾乎所有程序運行時可能會遇到,而編譯時無法檢查到的錯誤,標準Java異常,主要的運行期異常ArithmeticException:算術異常ArrayStoreExceptio
28、n:數(shù)組存儲類型錯誤ClassCastException:變量類型設置錯誤IllegalArgumentException:函數(shù)的參數(shù)錯誤IndexOutOfBoundsException:數(shù)組下標越界NegativeArraySizeException:數(shù)組長度為負值NullPointerException:使用空指針變量SecurityException:違反安全要求UnsupportedOperationExcept
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- sql2005置疑修復
- 基于delphi 7.0+sql sever2000設備管理模塊開發(fā)研究
- sql server 2005內部測試_b
- gsb_chicago_2005-06
- sql server 2005數(shù)據(jù)庫課程設計
- jsp中使用jdbc連接sql_server_2005
- sql2005 從日志中恢復delete數(shù)據(jù)
- sql server 2005 學習筆記之觸發(fā)器簡介
- 畢業(yè)設計外文文獻翻譯_sql_2005
- java學生選課系統(tǒng)(完整源代碼-sql2005)
- 《軟件工程》精品課程教學網(wǎng)站的設計與實現(xiàn) asp+sql sever2000
- sql server2005數(shù)據(jù)庫備份與恢復研究-
- ZBMP-2005-06鋁合金外殼.dwg
- ZBMP-2005-06鋁合金外殼.dwg
- ZBMP-2005-06鋁合金外殼.dwg
- ZBMP-2005-06鋁合金外殼.dwg
- sql-實驗2-2
- win7狀態(tài)下裝u8.72(sql2005)
- dbch07-sql server 2005 數(shù)據(jù)庫管理系統(tǒng)自學
- sql_server_2005_不允許遠程連接解決方法
評論
0/150
提交評論