




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章Java異常處理7.1異常處理概述7.2異常處理機制7.3finally子句7.4自定義異常
7.1異常處理概述
編寫一個Java程序,打開本地磁盤下的D:\test.txt文件。編譯代碼時的顯示結果如圖7.1所示。
由編譯信息可知,以上程序將產生FileNotFoundException異常。因此,若希望程序正確運行,編譯器需能夠處理FileNotFoundException異常。圖7.1例7-1的運行結果7.1.1異常處理基礎
異常即程序運行過程中發(fā)生的異常事件,如例7-1所描述。程序運行時出現(xiàn)異常則生成異常對象,生成的異常對象被交給Java虛擬機,Java虛擬機尋找相應的代碼來處理這一異常。生成異常對象并把它交給Java虛擬機的過程稱為拋出(throw)異常。在Java虛擬機得到一個異常對象后,它將會尋找處理這一異常的代碼。尋找異常處理方法的過程從生成異常的方法開始,沿著方法的調用棧逐層回朔,直到找到包含相應異常處理的方法為止。然后,Java虛擬機把當前異常對象交給這個方法進行處理。這一過程稱為捕獲(catch)異常。如果查遍整個調用棧仍然沒有找到合適的異常處理方法,Java虛擬機將終止Java程序的執(zhí)行。
Java異常處理過程通過5個關鍵字控制:try、catch、finally、throw和throws。其中,try、catch和finally構成異常處理的完整語法。
try{
//異常監(jiān)控區(qū)域代碼塊
}
catch(ExceptionTypee){
//ExceptionType類型異常處理
}
finally{
//方法返回前需執(zhí)行的代碼塊
}
try語句塊表示要嘗試運行的代碼塊,try語句塊中代碼受異常監(jiān)控,其中代碼發(fā)生異常時,會拋出異常對象。
catch語句塊會捕獲try代碼塊中發(fā)生的異常,并在其代碼塊中做異常處理。catch語句帶一個Throwable類型的參數(shù),表示可捕獲的異常類型。當try中出現(xiàn)異常時,catch會捕獲到發(fā)生的異常,并和自己的異常類型匹配,若匹配,則執(zhí)行catch塊中代碼,并將catch塊參數(shù)指向所拋的異常對象。catch語句可以有多個,用來匹配多個異常。某個異常與catch塊一旦匹配成功,就不再嘗試匹配別的catch塊了。通過異常對象可以獲取異常發(fā)生時完整的Java虛擬機堆棧信息,以及異常信息和異常發(fā)生的原因等。
finally語句塊是緊跟在catch語句后的語句塊,不管try語句塊是否發(fā)生異常該語句塊總會被執(zhí)行。finally語句塊總是在方法返回前執(zhí)行,目的是給程序一個補救的機會。這也體現(xiàn)了Java語言的健壯性。
throw和throws的用法描述如下。
publicstaticvoidtest()throwsException{
//拋出一個檢查異常
thrownewException(“方法test中的Exception”);
}
throw關鍵字用于方法體內部,用來拋出一個Throwable類型的異常。如果拋出了檢查異常,則還應該在方法頭部聲明,方法可能拋出的異常類型。該方法的調用者也必須檢查和處理拋出的異常。如果所有方法都層層上拋獲取的異常,最終Java虛擬機會進行處理,處理也很簡單,就是打印異常消息和堆棧信息。如果拋出的是Error或RuntimeException,則該方法的調用者可選擇處理該異常。7.1.2異常的分類
Java把異常當作對象來處理,并定義一個基類java.lang.Throwable作為所有異常的超類。在JavaAPI中已經定義了許多異常類,這些異常類分為兩大類:錯誤(Error)和異常(Exception)。Java異常體系結構呈樹狀,其層次結構如圖7.2所示。圖7.2Java異常體系結構所有異常類型都是內置類Throwable的子類,因此,Throwable在異常類層次結構的頂層。Thorwable類有兩個子類Error和Exception,分別表示錯誤和異常。其中異常類Exception又分為運行時異常(RuntimeException)和非運行時異常,這兩種異常有很大的區(qū)別,也稱之為不檢查異常(UncheckedException)和檢查異常(CheckedException)。下面將詳細講述這些異常之間的區(qū)別與聯(lián)系。
1.Error與Exception類
Error類是錯誤類,表示僅靠程序本身無法修復的嚴重錯誤,如內存溢出錯誤(OutOfMemoryError)、線程死亡錯誤(ThreadDeath)等。這類異常發(fā)生時,Error類對象由Java虛擬機生成并拋出給系統(tǒng)。本章不再討論關于Error類型的異常處理,因為它們通常是災難性的致命錯誤,不是程序可以控制的。
Exception類是異常類,表示程序本身可以處理的異常。它從父類Throwable中繼承了成員變量和成員方法,只在自身類中聲明了一些構造方法。程序中的每一個異常對應于Exception類的一個子類實例,異常對象中包含異常的位置和特征信息。這種異常分兩大類:運行時異常和非運行時異常。程序應當盡可能去處理這些異常。
2.運行時異常和非運行時異常
運行時異常都是RuntimeException類及其子類異常,如空對象異常(NullPointerException)、算術異常(ArithmeticException)、類型強制轉換異常(ClassCastException)、數(shù)組下標越界異常(ArrayIndexOutOfBoundsException)、數(shù)值格式異常(NumberFormatException)等。這些異常是不檢查異常,程序可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發(fā)生。非運行時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類,如IOException、SQLException等。這些異常是檢查異常,從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能通過編譯。一般情況下不自定義檢查異常。7.1.3異常的描述
異常類Exception的超類為Throwable類。Throwable類中定義了方法來檢索與異常相關的信息,并打印顯示異常發(fā)生的棧跟蹤信息。這些方法的描述見表7.1。程序運行結果如圖7.3所示。圖7.3例7-2的運行結果顯然,printStackTrace()方法可獲得比getMessage()方法更多的信息。
7.2異常處理機制
7.2.1捕獲和處理異常
盡管Java運行時由系統(tǒng)提供的默認異常處理程序對于調試很有用,但程序員通常都希望能手動處理異常。這樣做有兩個好處。第一,允許修正錯誤。第二,防止程序自動終止。但Java異常的捕獲和處理是一件不容易把握的事情,如果處理不當,不但會讓程序的可讀性大大降低,而且導致系統(tǒng)性能低下,甚至引發(fā)一些難以發(fā)現(xiàn)的錯誤。為防止和處理一個運行時錯誤,只需要把所要監(jiān)控的代碼放進一個try語句塊。緊跟try語句塊的是一個能夠捕獲程序員所希望的錯誤類型的catch語句塊。下面的程序包含一個處理例7-1中FileNotFoundException異常的try語句塊和catch語句塊。圖7.4例7-3的運行結果注意在異常發(fā)生時,try語句塊中的“System.out.println("Afteropening");”語句是不會被執(zhí)行的。一旦異常被引發(fā),程序控制由try語句塊轉到catch語句塊,而不會從catch語句塊返回到try語句塊。一旦執(zhí)行了catch語句,程序控制從整個try/catch塊的下面一行繼續(xù)。一個try語句塊和它的catch語句塊形成了一個單元,try語句塊不能單獨使用。一個catch語句塊的范圍受限于前面所定義的try語句塊,它不能捕獲另一個try語句塊聲明所引發(fā)的異常。catch語句的參數(shù)類似于方法的聲明,包括一個異常類型和一個異常對象。異常類型必須為Throwable類的子類,它指明了catch語句所處理的異常類型。異常對象在try語句塊中生成并被捕獲,異常對象名可以是任意標識符,但通常用小寫字母e作為異常對象名,表示異常對象。某些情況下,單個代碼段可能引發(fā)多個異常。處理這種情況,需要定義兩個或更多的catch語句塊,每個語句塊捕獲一種類型的異常。當異常被引發(fā)時,Java虛擬機從上到下將當前異常對象的類型和每個catch語句處理的異常類型進行比較,直到找到最匹配的catch語句為止。當一個catch語句執(zhí)行以后,其他的catch語句被忽略,執(zhí)行從try/catch塊以后的第一行代碼繼續(xù)。這里,類型匹配是指catch所處理的異常類型與生成的異常對象的類型或者是它的父類完全一致。當D:\test.txt文件不存在時,程序發(fā)生FileNotFoundException異常,運行結果如圖7.5所示。圖7.5例7-4的運行結果當D:\test.txt文件存在時,程序不會發(fā)生FileNotFoundException異常。程序向下執(zhí)行并發(fā)生ArrayIndexOutOfBoundsException異常,運行結果如圖7.6所示。圖7.6例7-4的另一個運行結果當有多個catch語句時,catch語句的排列順序應該是從特殊異常到一般異常,即異常子類必須排在它們任何父類之前。比如有兩個catch語句分別處理ArithmeticException和Exception兩類異常對象,則ArithmeticException類的catch語句要寫在Exception類的catch語句之前。通常最后一個catch語句的異常類參數(shù)都聲明為Exception,這樣能夠保證捕獲和處理所有的異常對象。7.2.2聲明拋出異常
在有些情況下,一個方法并不需要處理它所生成的異常,或者不知道該如何處理這一異常,這時它就向上傳遞,由調用它的方法來處理這些異常。throws語句就用來處理這種情況。throws語句用于方法的聲明中,用來聲明該方法可能要拋出的異常類型。該方法的調用者必須捕獲并處理該類型的異常,這樣就實現(xiàn)了異常對象在方法之間的傳遞。包含一個throws語句的方法聲明的通用形式如下:
typemethod-name(exception-list)throwsexception-list
{
//bodyofmethod
}
這里,exception-list是該方法可以引發(fā)的以逗號分割的異常列表。
【例7-5】錯誤的示例。該例試圖引發(fā)一個它不能捕獲的異常。因為程序沒有指定一個throws子句來聲明這一事實,程序將無法編譯。
publicclassExample7_5{
staticvoidthrowOne(){
System.out.println(“InsidethrowOne.”);
thrownewIllegalAccessException(“demo”);
}
publicstaticvoidmain(Stringargs[]){
throwOne();
}
}
【例7-6】正確的示例。為編譯例7.5的程序,需對其進行以下修改:①聲明throwOne()方法引發(fā)IllegalAccessException異常;②main()方法必須定義一個try/catch語句來捕獲該異常。
publicclassExample7_6{
staticvoidthrowOne()throwsIllegalAccessException{
System.out.println(“InsidethrowOne.”);
thrownewIllegalAccessException(“demo”);
}
publicstaticvoidmain(Stringargs[]){
try{
throwOne();
}
catch(IllegalAccessExceptione){
System.out.println(“Caught”+e);
}
}
}圖7.7例7-6的運行結果7.3finally子句
異常改變了程序正常的執(zhí)行流程。如例7-4所示,程序打開了文件D:\test.txt后發(fā)生異常,此時文件尚未關閉,將導致文件寫入失敗。如果程序使用了文件、Socket、JDBC連接之類的資源,即使遇到了異常,也要正確釋放占用的資源。為此,Java提供了一個簡化這類操作的關鍵詞finally。finally創(chuàng)建一個代碼塊,該代碼塊在一個try/catch塊完成之后另一個try/catch塊出現(xiàn)之前執(zhí)行。finally塊無論有沒有異常引發(fā)都會被執(zhí)行,這在關閉文件句柄和釋放任何在方法開始時被分配的其他資源是很有用的。
try、catch、finally三個語句塊均不能單獨使用,三者可以組成try...catch...finally、try...catch、try...finally三種結構。catch語句可以有一個或多個,finally語句最多一個。try、catch、finally三個代碼塊中變量的作用域僅限于代碼塊內部,分別獨立且不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。
例7.7顯示
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 風險應對策略的選擇試題及答案
- 高考語文考場應用試題及答案
- 湖北省咸寧市咸安區(qū)2025年八下數(shù)學期末統(tǒng)考試題含解析
- 制定個人學習與發(fā)展路徑計劃
- 細分市場的品牌定位研究計劃
- 提升領導力的實踐方法計劃
- 計算機科學專業(yè)進階學習策略試題及答案
- 計算機輔助翻譯(CAT)軟件應用試題及答案
- 2024年陜西科技大學輔導員考試真題
- 風險管理中的人才培養(yǎng)與發(fā)展試題及答案
- 各級無塵室塵埃粒子測量表
- 成人本科學士學位英語詞匯
- 第7課《溜索》一等獎創(chuàng)新教學設計
- WMO五年級初級測評專項訓練
- 班主任節(jié)PPT幻燈片課件
- 北師大高中英語必修一 (Celebrations)課件(第8課時)
- 中興(ZXA10-XPON)高級工程師認證考試題庫(含答案)
- 單值-移動極差X-MR控制圖-模板
- 建筑水電安裝施工專項方案
- 離婚協(xié)議書電子版可打印
- 天然氣輸氣管道
評論
0/150
提交評論