




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章Java異常處理
7.1異常處理概述7.2Java異常的處理方法
本章要點了解異常和異常分類理解Java異常處理機制和異常類。掌握try/catch/finally語句處理異常的方式以及如何聲明異常。了解自定義異常。7.1異常處理概述
Java異常是描述在代碼段中發生的運行出錯情況的對象。程序中的錯誤可能來自于編譯錯誤和運行錯誤。編譯錯誤是由于所編寫的程序存在語法問題,未能通過由源代碼到目標代碼的編譯過程而產生的錯誤,它將由語言的編譯系統負責檢測和報告;運行錯誤是在程序的運行過程中產生的錯誤。7.1.1什么是異常 在程序執行中,任何中斷正常程序流程的異常條件就是錯誤或異常。 第一種,Java虛擬機檢測到了非正常的執行狀態,這些狀態可能是由以下幾種情況引起的: ①表達式的計算違反了Java語言的語義,例如整數被0除。 ②在載入或鏈接Java程序時出錯。 ③超出了某些資源限制,例如使用了太多的內存。 第二種,Java程序代碼中的throw語句被執行。 第三種,異步異常發生。異步異常的原因可能有: ①Thread的stop方法被調用。 ②Java虛擬機內部錯誤發生。7.1.2異常處理機制
Java異常處理是通過5個關鍵字來管理的。它們是try、catch、throw、throws和finally。
程序里,需要被監測的程序語句序列應包含在一個try代碼塊中。如果try代碼塊中有異常發生,那么就要拋出該異常。可以用catch來捕獲這個異常,并且在catch塊中加以適當地處理。系統產生的異常會由Java運行時系統自動拋出。如果要手動拋出異常,則使用關鍵字throw。在一些情況下,從一個方法拋出的異常必須用一個throws語句指定為異常。最后,從try代碼塊退出時,必須執行的代碼要放在一個finally代碼塊中。7.1.3異常分類
Java中的異常類具有層次組織,其中Throwable類是Error類(錯誤類)和Exception類(異常類)的父類,Throwable是Object的直接子類。 異常類(java.lang.Exception)繼承于java.lang.Object中的java.lang.Throwable類。異常可分為執行異常(RuntimeException)和檢查異常(CheckedExceptions)兩種。異常類的繼承結構ThrowableErrorExceptionObjectAWTExceptionRuntimeExceptionIOException……
1.執行異常即運行時異常,繼承于RuntimeException。Java編譯器允許程序不做處理。ArithmeticException:一個不尋常算術運算產生的異常。ArrayStoreException:存入數組的內容數據類型不一致所產生的異常。ArrayIndexOutOfBoundsException:數組索引超出范圍所產生的異常。ClassCastExcption:類對象強迫轉換造成不當類對象所產生的異常。NumberFormatException:字符串轉換數值所產生的異常。IndexOutOfBoundsException:索引超出范圍所產生的異常。NegativeException:數組建立負值索引所產生的異常。NullPointerException:對象引用參考值為null所產生的異常。
2.檢查異常 除了執行異常外,其余的子類是屬于檢查 異常類也稱為非運行時異常,它們都在
java.lang類庫內定義。Java編譯器要求程序必須捕獲或者聲明拋棄這種異常。
ClassNotFoundException:找不到類或接口所產生的異常。
CloneNotSupportedException:使用對象的clone方法但無法執行Cloneable所產生的異常。
IllegaAccessException:類定義不明確所產生的異常。
InstantiationException:使用newInstance方法試圖建立一個類instance時所產生的異常。
InterruptedException:目前線程等待執行,另一線程中斷目前線程所產生的異常。
7.1.4錯誤分類
Error類與異常一樣,它們都是繼承自java.lang.Throwable類。Error類對象由Java虛擬機生成并拋出。Error類包括linkageError(結合錯誤)與VitualmachineError(虛擬機錯誤)兩種子類。1.linkageErrorLinkageError的子類表示一個類依賴于另一個類,但是,在前一個類編譯之后,后一個類的改變會與它不兼容。ClassFormarErro:類格式所產生的錯誤。ClassCircularityError:無限循所產生的錯誤。ExceptionInInitializerError:初始化所產生的錯誤。NoClassDeFormatError:沒有類定義所產生的錯誤。VeritfyError:類文件某些數據不一致或安全問題所產生的錯誤。UnsatisfidLinkError:Java虛擬機無法找到合適的原始語言(native-language)定義的方法所產生的錯誤。IncompatibleClassChangeError:不兼容類所產生的錯誤。AbtractMethodError:調用抽象方法所產生的錯誤。NoSuchFieldError:存取或改變數據域所產生的錯誤。NoSchMethodError:調用類方法所產生的錯誤。IllegalAccessError:不合法存取或改變數據域或調用方法所產生的錯誤。InstantionError:使用抽象類或接口所產生的錯誤。 2.VitualmachineError
當Java虛擬機崩潰了或用盡了它繼續操作所需的資源時,拋出該錯誤。
VitualmachineError包含InternalError,OutOfMemoryError,StackOverflow-Error,UnknownError。這些類所代表的意義:
InternalError:虛擬機內部所產生的錯誤。
OutOfMemoryError:虛擬機內存不足所產生的錯誤。
StackOverflowError:堆棧無法容納所產生的錯誤。
UnknownError:虛擬機不知名異常所產生的錯誤。7.2Java異常的處理方法 當發生Exception時,那么,在編寫程序時可以采取的措施: ①通過將try{}catch(){}塊納入其代碼中,在這里捕獲被命名為屬于某個超類的異常,并調用方法處理它。 ②讓被調用的方法表示它將不處理異常,將該異常拋到它所遇到的調用方法中。這用throws子句實現。 使用throws子句標記調用方法的聲明如下所示:
publicvoidtroublesome()throwsException
其中,關鍵字throws之后是所有異常的列表,方法可以將它們拋回到它的調用程序中。1.try/catchtry/catch異常處理代碼塊的基本形式:
try
//監視{可能發生異常的代碼塊;}
catch(異常類型異常對象名)//捕獲并處理異常{異常處理代碼塊;} 當拋出一個異常時,異常會由相應的catch語句捕獲并處理。與一個try相關的catch語句可以有多個,構成多重catch語句,異常類型決定了要執行哪個catch語句。 如果沒有拋出異常,那么try代碼塊就會結束,并且會跳過它的所有catch語句,從最后一個catch后面的第一個語句繼續執行。
7.2.1try/catch/finally
例7.2使用try/catch進行異常處理的情況。publicclassExceptionExam0{
publicstaticvoidmain(Stringargs[]){
inti,a;
try{//監視一代碼塊
i=0;
a=42/i;return;
}catch(ArithmeticExceptione){//捕獲一個被零除異常System.out.println("被零除");}
}}例7.2成運行結果如圖所示
2.可嵌入的try塊 一個try代碼塊可以嵌入到另一個try代碼塊當中。由于內部try代碼塊產生的異常如果沒有被與該內部try代碼塊相關的catch捕獲,就會傳到外部try代碼塊。 通常嵌入式try代碼塊用于以不同方式處理不同類型的錯誤。某些類型的錯誤是致命的,無法修改。某些錯誤則較輕,可以馬上處理。許多程序員在使用外部try代碼塊捕獲大部分嚴重錯誤的同時,讓內部try代碼處理不太嚴重的錯誤。
例7.3嵌套try語句的示例。publicclassExceptionExam2{publicstaticvoidmain(Stringargs[]){intdata1[]={2,4,6,8,10,12};intdata2[]={1,0,2,4,3};try{for(inti=0;i<data1.length;i++){try{System.out.println(data1[i]+"/"+data2[i]+"is"+data1[i]/data2[i]);}catch(ArithmeticExceptione){System.out.println("不能被零除!");}}}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("程序被終止!");}}}例7.3成運行結果如圖所示
3.使用多重catch語句 與一個try相關的catch語句可以有多個。每一個catch語句捕獲一個不同類型的異常。某些情況,由單個代碼段可能引起多個異常。處理這種情況時就需要定義兩個或更多的catch子句,每個子句捕獲一種類型的異常。當異常被引發時,每一個catch子句被依次檢查,第一個匹配異常類型的子句被執行。當一個catch語句執行以后,其他的子句被忽略,程序從try/catch塊后的代碼開始繼續執行。例7.4捕獲兩種不同類型的異常。publicclassExceptionExam3{
publicstaticvoidmain(Stringargs[]){try{inti=args.length;System.out.println("i="+i);intj=5/i;intk[]={1,2,3};k[5]=0;}catch(ArithmeticExceptione){System.out.println("被零除:"+e);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Arrayindexoutofboundexception:"+e);}System.out.println("執行catch塊后的語句塊");}}例7.4成運行結果如圖所示 4.finally關鍵字的使用
try/catch/finally的基本形式如下所示:
try
{
可能發生異常的代碼塊; }
catch(異常類型異常對象名) { 異常處理代碼塊; } …
finally {
無論是否拋出異常都要執行的代碼; } 無論是出于何種原因,只要執行離開try/catch代碼塊,就會執行finally代碼塊。即無論try是否正常結束,都會執行finally定義的最后的代碼。例7.5使用finally的示例。publicclassExceptionExam4{ publicstaticvoidmain(String[]args) { try { int[]a=newint[3]; a[2]=4;return; }catch(ArithmeticExceptione){ System.out.println("發生了異常");}finally{ System.out.println("最后執行的語句!");}}}例7.5成運行結果如圖所示7.2.2聲明異常(throws)聲明拋棄異常是在一個方法聲明中的throws子句中指明的。下面是包含throws子句的方法的基本形式:[修飾符]返回類型方法名(參數1,參數2,……)throws異常列表{……}例如:publicintread()throwsIOException{……}throws子句中同時可以指明多個異常,說明該方法將不對這些異常進行處理,而是聲明拋棄它們。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException
{……}
7.2.3拋出異常(throw)
手動拋棄異常對象是通過throw語句實現的,但可以拋棄的異常必須是Throwable或其子類的實例。其基本形式如下:
throw異常名;
throw關鍵字主要是用在try塊中,用來說明已經發生的異常情況。throw關鍵字后面跟隨一個從類Throwable中派生的異常對象,用來說明發出的異常類型。throw語句促使程序立即停止運行,并且重復執行最近能夠處理指定對象的catch語句。如果異常在程序的其他地方產生,throw語句也可以放在try語句的后面。為了把異常處理控制傳遞給更高層的處理模塊,還可以對截獲的異常對象再一次實施throw操作。例7.7使用throw關鍵字手動拋出IOException異常。importjava.io.*;publicclassExceptionExam6{publicstaticvoidmain(String[]args){try{System.out.println("…正在運行程序…");thrownewIOException("用戶自行產生異常");}catch(IOExceptione){System.out.println("已捕獲了該異常!");}}}例7.7成
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CAEPI 70-2023水泥窯協同處置生活垃圾焚燒飛灰水洗除鹽工藝技術要求
- 辦理資質委托代理協議3篇
- 食品廠入職合同3篇
- 專業基礎知識試題及答案
- 上海數學期末試題及答案
- 上戲往試題及答案
- 殘疾人輔助就業 用工協議6篇
- 認識媒體和信息素養
- T/ZQIE 006-2023金利五金高品質家居用緩沖型杯狀暗鉸鏈
- 問卷設計說明書
- 2024年中國航空工裝行業發展現狀、市場運行態勢及發展前景預測報告
- 中考英語688高頻詞大綱詞頻表
- 一年級下冊口算題卡大全(口算練習題50套直接打印版)
- 外貿鎖檢測報告樣式EN12209
- 無損檢測人員登記表
- DB33-T 2048-2017(2021)民宿基本要求與評價
- 1員工培訓記錄表表格類
- 某大學論文答辯模板課件
- 50以內加減法練習題打印版(100題)
- 基礎體溫表格基礎體溫表
- 煤炭項目建議書【范文參考】
評論
0/150
提交評論