已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第七章 異 常 本模塊講述建立在Java編程語言中的錯誤處理裝置。第一節(jié) 相關問題 討論下述問題與本模塊中的材料相關:- 在大部分編程語言中,如何解決運行時錯誤?第二節(jié) 目 的 本模塊學習結束后,能夠:- 定義異常- 使用try,catch和finally語句- 描述異常分類- 開發(fā)程序來處理自己的異常 第三節(jié) 異 常異 常 異常類定義程序所遇到的輕微錯誤 發(fā)生下列情況時,會出現(xiàn)異常: 想打開的文件不存在 網絡連接中斷 受控操作數(shù)超出預定范圍 非常感興趣地正在裝載的類文件丟失 錯誤類定義嚴重的錯誤條件7.3.1 介紹 什么是異常?在Java編程語言中,異常類定義程序中可能遇到的輕微的錯誤條件??梢詫懘a來處理異常并繼續(xù)程序執(zhí)行,而不是讓程序中斷。 在程序執(zhí)行中,任何中斷正常程序流程的異常條件就是錯誤或異常。例如,發(fā)生下列情況時,會出現(xiàn)異常:- 想打開的文件不存在- 網絡連接中斷- 受控操作數(shù)超出預定范圍- 非常感興趣地正在裝載的類文件丟失 在Java編程語言中,錯誤類定義被認為是不能恢復的嚴重錯誤條件。在大多數(shù)情況下,當遇到這樣的錯誤時,建議讓程序中斷。 Java編程語言實現(xiàn)C+異常來幫助建立彈性代碼。在程序中發(fā)生錯誤時,發(fā)現(xiàn)錯誤的方法能拋出一個異常到其調用程序,發(fā)出已經發(fā)生問題的信號。然后,調用方法捕獲拋出的異常,在可能時,再恢復回來。這個方案給程序員一個寫處理程序的選擇,來處理異常。 通過瀏覽API,可以決定方法拋出的是什么樣的異常。7.3.2 實例 考慮一下HelloWorld.java程序版本的簡單擴展,它通過信息來循環(huán):1. public class HelloWorld 2. public static void main (String args) 3. int i = 0; 4.5. String greetings = 6. Hello world!,7. No, I mean it!,8. HELLO WORLD!9. ;10.11. while (i java HelloWorld2. Hello world!3. No, I mean it!4. HELLO WORLD!5. java.lang.ArrayIndexOutOfBoundsException: 36. at HelloWorld.main(HelloWorld.java:12) 異常處理允許程序捕獲異常,處理它們,然后繼續(xù)程序執(zhí)行。它是分層把關,因此,錯誤情況不會介入到程序的正常流程中。特殊情況發(fā)生時,在與正常執(zhí)行的代碼分離的代碼塊中被處理。這就產生了更易識別和管理的代碼。第四節(jié) 異常處理 Java編程語言提供了一個來考慮哪個異常被拋出以及如何來恢復它的機制。7.4.1 try和catch語句try和catch語句1. try 2. / code that might throw a particular exception3. catch (MyExceptionType e) 4. / code to execute if a MyExceptionType exception is thrown 5. catch (Exception e) 6. / code to execute if a general Exception exception is thrown 7. 要處理特殊的異常,將能夠拋出異常的代碼放入try塊中,然后創(chuàng)建相應的catch塊的列表,每個可以被拋出異常都有一個。如果生成的異常與catch中提到的相匹配,那么catch條件的塊語句就被執(zhí)行。在try塊之后,可能有許多catch塊,每一個都處理不同的異常。1. try 2. / code that might throw a particular exception3. catch (MyExceptionType e) 4. / code to execute if a MyExceptionType exception is thrown 5. catch (Exception e) 6. / code to execute if a general Exception exception is thrown 7. 7.4.2 調用棧機制 如果方法中的一個語句拋出一個沒有在相應的try/catch塊中處理的異常,那么這個異常就被拋出到調用方法中。如果異常也沒有在調用方法中被處理,它就被拋出到該方法的調用程序。這個過程要一直延續(xù)到異常被處理。如果異常到這時還沒被處理,它便回到main(),而且,即使main()不處理它,那么,該異常就異常地中斷程序。 考慮這樣一種情況,在該情況中main()方法調用另一個方法(比如,first()),然后它調用另一個(比如,second())。如果在second()中發(fā)生異常,那么必須做一個檢查來看看該異常是否有一個catch;如果沒有,那么對調用棧(first())中的下一個方法進行檢查,然后檢查下一個(main())。如果這個異常在該調用棧上沒有被最后一個方法處理,那么就會發(fā)生一個運行時錯誤,程序終止執(zhí)行。7.4.3 finally語句finally語句1. try 2. startFaucet();3. waterLawn();4. 5. finally 6. stopFaucet();7. finally語句定義一個總是執(zhí)行的代碼塊,而不考慮異常是否被捕獲。下述樣板代碼來自Frank Yellin弗蘭克葉林的白皮書Java中的低級安全:1. try 2. startFaucet();3. waterLawn();4. 5. finally 6. stopFaucet();7. 在前面的例子中,即使異常在打開開關或給草地澆水時發(fā)生,開關也能被關掉。try 后面的括號中的代碼被稱做保護碼。 如果終止程序的System.exit()方法在保護碼內被執(zhí)行,那么,這是finally語句不被執(zhí)行的唯一情況。這就暗示,控制流程能偏離正常執(zhí)行順序,比如,如果一個return語句被嵌入try塊內的代碼中,那么,finally塊中的代碼應在return前執(zhí)行。7.4.4 重訪前例 下面的例子是第169頁main()方法的重寫。本程序以前的版本中產生的異常被捕獲,數(shù)組索引重新設定,使下述程序繼續(xù)運行。1. public static void main (String args) 2. int i = 0;3. String greetings = 4. Hello world!,5. No, I mean it!,6. HELLO WORLD!7. ;8. while (i 4) 9. try 10. System.out.println (greetingsi);11. catch (ArrayIndexOutOfBoundsException e)12. System.out.println( Re-setting Index Value);13. i = -1;14. finally 15. System.out.println(This is always printed);16. 17. i+;18. / end while()19. / end main() 當循環(huán)被執(zhí)行時,下述在屏幕上出現(xiàn)的信息將改變。1. Hello world!2. This is always printed3. No, I mean it!4. This is always printed5. HELLO WORLD! 6. This is always printed7. Re-setting Index Value 8. This is always printed 第五節(jié) 異常分類 在Java編程語言中,異常有三種分類。Java.lang.Throwable類充當所有對象的父類,可以使用異常處理機制將這些對象拋出并捕獲。在Throwable類中定義方法來檢索與異常相關的錯誤信息,并打印顯示異常發(fā)生的棧跟蹤信息。它有Error和Exception兩個基本子類,如下圖所示: Throwable類不能使用,而使用子類異常中的一個來描述任何特殊異常。每個異常的目的描述如下:- Error表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。- RuntimeException表示一種設計或實現(xiàn)問題。也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。比如,如果數(shù)組索引擴展不超出數(shù)組界限,那么,ArrayIndexOutOfBoundsException異常從不會拋出。比如,這也適用于取消引用一個空值對象變量。因為一個正確設計和實現(xiàn)的程序從不出現(xiàn)這種異常,通常對它不做處理。這會導致一個運行時信息,應確保能采取措施更正問題,而不是將它藏到誰也不注意的地方。- 其它異常表示一種運行時的困難,它通常由環(huán)境效果引起,可以進行處理。例子包括文件未找到或無效URL異常(用戶打了一個錯誤的URL),如果用戶誤打了什么東西,兩者都容易出現(xiàn)。這兩者都可能因為用戶錯誤而出現(xiàn),這就鼓勵程序員去處理它們。第六節(jié) 共同異常共同異常- ArithmeticException- NullPointerException- NegativeArraySizeException- ArrayIndexoutofBoundsException- SecurityException Java編程語言提供幾種預定義的異常。下面是可能遇到的更具共同性的異常中的幾種:- ArithmeticException整數(shù)被0除,運算得出的結果。- int I =12 / 0;- NullPointerException當對象沒被實例化時,訪問對象的屬性或方法的嘗試:- Date d= null;- System.out.println(d.toString();- NegativeArraySizeException創(chuàng)建帶負維數(shù)大小的數(shù)組的嘗試。- ArrayIndexoutofBoundsException訪問超過數(shù)組大小范圍的一個元素的嘗試。- SecurityException典型地被拋出到瀏覽器中,SecurityManager類將拋出applets的一個異常,該異常企圖做下述工作(除非明顯地得到允許):- 訪問一個本地文件- 打開主機的一個socket,這個主機與服務于applet的主機不是同一個。- 在運行時環(huán)境中執(zhí)行另一個程序第七節(jié) 處理或聲明規(guī)則處理或聲明規(guī)則- 用try-catch-finally塊來處理異常- 使用throws子句聲明代碼能引起一個異常 為了寫出健壯的代碼,Java編程語言要求,當一個方法在棧(即,它已經被調用)上發(fā)生Exception(它與Error或RuntimeException不同)時,那么,該方法必須決定如果出現(xiàn)問題該采取什么措施。 程序員可以做滿足該要求的兩件事: 第一,通過將Trycatch()塊納入其代碼中,在這里捕獲給被命名為屬于某個超類的異常,并調用方法處理它。即使catch塊是空的,這也算是處理情況。 第二,讓被調用的方法表示它將不處理異常,而且該異常將被拋回到它所遇到的調用方法中。它是按如下所示通過用throws子句標記的該調用方法的聲明來實現(xiàn)的: public void troublesome() throws IOException 關鍵字throws之后是所有異常的列表,方法可以拋回到它的調用程序中。盡管這里只顯示了一個異常,如果有成倍的可能的異??梢酝ㄟ^該方法被拋出,那么,可以使用逗號分開的列表。 是選擇處理還是選擇聲明一個異常取決于是否給你自己或你的調用程序一個更合適的候選的辦法來處理異常。注由于異常類象其它類一樣被組編到層次中,而且由于無論何時想要使用超類都必須使用子類, 因此,可以捕獲異?!敖M”并以相同的捕獲代碼來處理它們。例如,盡管IOExceptions(EOFException,FileNotFoundException等等)有幾種不同的類型,通過俘獲IOException,也可以捕獲IOException任何子類的實例。第八節(jié) 創(chuàng)建自己的異常7.8.1 介紹 用戶定義異常是通過擴展Exception類來創(chuàng)建的。這種異常類可以包含一個“普通”類所包含的任何東西。下面就是一個用戶定義異常類例子,它包含一個構造函數(shù)、幾個變量以及方法:1. public class ServerTimedOutException extends Exception 2. private String reason;3. private int port;4. public ServerTimedOutException (String reason,int port) 5. this.reason = reason;6. this.port = port;7. 8. public String getReason() 9. return reason;10. 11. public int getPort() 12. return port;13. 14. 使用語句來拋出已經創(chuàng)建的異常:throw new ServerTimedOutException(Could not connect, 80);7.8.2 實例 考慮一個客戶服務器程序。在客戶代碼中,要與服務器連接,并希望服務器在5秒鐘內響應。如果服務器沒有響應,那么,代碼就如下所述拋出一個異常(如一個用戶定義的ServerTimedOutException)。1. public void connectMe(String serverName) throws ServerTimedOutException 2. int success;3. int portToConnect = 80;4. success = open(serverName, portToConnect);5. if (success = -1) 6. throw new ServerTimedOutException(7. Could not connect, 80);8. 9. 要捕獲異常,使用try語句:1. public void findServer() 2. . . .3. try 4. connectMe(defaultServer);5. catch(ServerTimedOutException e) 6. System.out.println(Server timed out, trying alternate);7. try 8. connectMe(alternateServer);9. catch (ServerTim
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雪公開課課件
- 雨花臺課件教學課件
- 2026年中藥學碩士研究生入學考試中草藥與方劑題庫
- 雨季安全行車課件教學
- 2026年煉油廠油罐火災應急處置預案
- 2026年醫(yī)療健康 遠程診療服務項目營銷方案
- 2026年手機睡眠管理應用項目營銷方案
- 職業(yè)經理人管理干部薪酬績效考核管理辦法方案
- 自動控制原理經典例題及答案
- 2026年仿生機器人關節(jié)系統(tǒng)項目營銷方案
- 2026年山東勝利職業(yè)學院單招綜合素質考試題庫附答案解析
- 不合格人員再培訓制度
- 《世說新語》啟發(fā)教學法示范教案
- 四川省2025年高職單招職業(yè)技能綜合測試(中職類)計算機類試卷(含答案解析)
- 2025年采制樣工崗位培訓與考試題庫采及答案
- 中國微生物肥項目創(chuàng)業(yè)投資方案
- 山東省濰坊市2025年中考數(shù)學真題附真題答案
- 137案例黑色三分鐘生死一瞬間事故案例文字版
- 超聲引導下外周靜脈輸液技術臨床應用與進展
- 《駱駝祥子》知識點24章分章內容詳述(按原著)
- 2024年救援車輛調度協(xié)議3篇
評論
0/150
提交評論