版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第六章異常處理一、異常和異常處理二、異常處理語句三、創(chuàng)建用戶自定義異常類第一節(jié)異常和異常處理異常是程序運行過程中由于硬件設備問題或者軟件設計缺陷而產(chǎn)生的不正常情況,如文件找不到、網(wǎng)絡連接失敗、非法參數(shù)等。異常是一個事件,它發(fā)生在程序運行期間,干擾了正常的指令流程。它主要幫助我們在debug的過程中解決下面三個問題。什么出錯?哪里出錯?為什么出錯?第一節(jié)異常和異常處理異常和異常處理一、異常但是,并不是所有的錯誤都是異常,錯誤有時候是可以避免的。比如,代碼少了一個分號,那么運行結(jié)果會提示java.lang.Error,表示出錯;如果使用System.out.println(11/0)語句,那么因為用0做了除數(shù),系統(tǒng)會拋出java.lang.ArithmeticException的異常。有些異常需要作處理,有些則不需要。第一節(jié)異常和異常處理異常處理是程序設計中一個非常重要的方面,也是程序設計的一大難點。從學習編程開始,我們會有意或無意地使用if-else來控制異常,然而這種控制非常繁瑣,如果多個地方出現(xiàn)同一個異?;蛘咤e誤,那么每個地方都要作相同處理,感覺相當麻煩,因此很多編程語言設計了異常處理機制。第一節(jié)異常和異常處理二、異常處理機制異常處理機制是指當異常產(chǎn)生時,為了讓程序不中斷而繼續(xù)運行的機制。每種語言對于異常的處理可能會不一樣,在Java中,異常處理機制包括Error和Exception兩個部分。它們都繼承自一個共同的基類Throwable。第一節(jié)異常和異常處理Error屬于JVM運行中發(fā)生的一些錯誤,雖然并不屬于開發(fā)人員的范疇,但是有些Error還是由代碼引起的。比如,StackOverflowError經(jīng)常由遞歸操作引起,這種錯誤一般無法挽救,只能依靠JVM。而Exception假設程序員會處理這些異常,比如數(shù)據(jù)庫連接出了異常,那么我們可以處理這個異常,并且重新連接等。Exception分為兩種,即檢查類型(Checked)和非檢查類型(Unchecked)。檢查類型的異常是指程序員明確地聲明或者用try-catch語句來處理的異常,而非檢查類型的異常則沒有這些限制。第一節(jié)異常和異常處理Java中的異常用對象來表示。Java對異常的處理是按異常分類進行的,不同異常有不同的分類,每種異常都對應一個類型(Class),每個異常都對應一個異常(類的)對象。異常類的來源有兩個:一是Java語言本身定義的一些基本異常類型,二是用戶通過繼承Exception類或者其子類自己定義的異常。Exception類及其子類是Throwable的一種形式,它指出了合理的應用程序想要捕獲的條件。第一節(jié)異常和異常處理三、Java中異常類和異常對象異常對象的來源有兩個:一是Java運行時環(huán)境自動拋出系統(tǒng)生成的異常,而不管程序員是否愿意捕獲和處理,它總要被拋出,比如除數(shù)為0的異常;二是程序員自己拋出的異常,這個異??梢允浅绦騿T自己定義的,也可以是Java語言中定義的,用throw關鍵字拋出異常,該異常用來向調(diào)用者匯報異常的一些信息。第一節(jié)異常和異常處理三、Java中異常類和異常對象Java異常類層次結(jié)構(gòu)如圖6.1所示。第一節(jié)異常和異常處理Throwable類是Java語言中所有錯誤或異常的超類。只有當對象是此類(或其子類之一)的實例時,才能通過Java虛擬機或者Javathrow語句拋出。類似,只有此類(或其子類之一)才可以是catch子句中的參數(shù)類型。兩個子類的實例,Error和Exception通常用于指出發(fā)生了異常情況。這些實例一般是在異常情況的上下文中新近創(chuàng)建的,因此包含了相關的信息(比如堆棧跟蹤數(shù)據(jù))。第一節(jié)異常和異常處理1.ThrowableException類及其子類是Throwable的一種形式,它指出了合理的應用程序想要捕獲的條件,表示程序本身可以處理的異常。第一節(jié)異常和異常處理2.ExceptionError是Throwable的子類,表示僅靠程序本身無法恢復的嚴重錯誤,用于指出合理的應用程序不應該試圖捕獲的嚴重問題。在執(zhí)行該方法期間,無需在方法中通過throws聲明可能拋出但沒有捕獲的Error的任何子類,因為Java編譯器不去檢查它。也就是說,當程序中可能出現(xiàn)這類異常時,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,編譯也能通過。第一節(jié)異常和異常處理3.ErrorRuntimeException是那些可能在Java虛擬機正常運行期間拋出的異常的超類。Java編譯器不去檢查它。也就是說,當程序中可能出現(xiàn)這類異常時,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,編譯也能通過。這種異??梢酝ㄟ^改進代碼實現(xiàn)來避免。以上是對有關異常API的一個簡單介紹,用法都很簡單,關鍵在于了解異常處理的原理,具體用法參看JavaAPI文檔。第一節(jié)異常和異常處理4.RuntimeException在Java應用程序中,異常處理機制分為拋出異常和捕捉異常。拋出異常:當一個方法出現(xiàn)錯誤引發(fā)異常時,方法創(chuàng)建異常對象并交付運行時系統(tǒng),異常對象中包含了異常類型和異常出現(xiàn)時的程序狀態(tài)等異常信息。運行時系統(tǒng)負責尋找處置異常的代碼并執(zhí)行。第一節(jié)異常和異常處理四、異常捕獲與處理捕獲異常:在方法拋出異常之后,運行時系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器(ExceptionHandler)。潛在的異常處理器是異常發(fā)生時依次存留在調(diào)用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即為合適的異常處理器。運行時系統(tǒng)從發(fā)生異常的方法開始,依次回查調(diào)用棧中的方法,直至找到含有合適異常處理器的方法并執(zhí)行。當運行時系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器時,運行時系統(tǒng)終止。同時,意味著Java程序的終止。第一節(jié)異常和異常處理Java的異常處理是通過5個關鍵字來實現(xiàn)的:try、catch、throw、throws和finally。其處理過程如圖6.2所示。第一節(jié)異常和異常處理1.異常處理的關鍵字try語句塊中是要執(zhí)行的代碼,如果這段代碼出現(xiàn)了異常,系統(tǒng)將會自動拋出(throws)一個異常,而catch后面有對應的異常,程序?qū)⑦M入對應的catch語句塊;最后,不管是否有異常,程序?qū)⑦M入finally語句塊進行缺省處理。第一節(jié)異常和異常處理異常處理程序的基本形式如下:try{ //代碼塊}catch(ExceptionType1e){ //處理ExceptionType1類型的異常}catch(ExceptionType2e){第一節(jié)異常和異常處理
//處理ExceptionType2類型的異常
throw(e);//再拋出ExceptionType2類型的異常}finally{ //缺省處理代碼}注意:catch語句塊可以存在多個,因為在程序運行的過程中,可能會發(fā)生多種異常,我們需要多個catch以提高程序的適應性。第一節(jié)異常和異常處理異常類(Exception)的子類很多,大致分為有關I/O的IOException、有關運行時異常的RuntimeException和其他異常三類。(1)?IOException:由于I/O系統(tǒng)堵塞等原因引起的異常,包括試圖從文件結(jié)尾處讀取信息、試圖打開一個不存在或者格式錯誤的URL。第一節(jié)異常和異常處理2.異常的類型常見的IOException如下:
FileNotFoundException:文件未找到異常。
EOFException:讀寫文件尾異常。
MalformedURLException:URL格式錯誤異常。
SocketException:Socket異常。第一節(jié)異常和異常處理(2)?RuntimeException:由于程序編寫過程中考慮不周全而引起的異常,包括錯誤的類型轉(zhuǎn)換、數(shù)組越界訪問、數(shù)字計算錯誤、試圖訪問一個空對象等。常見的RuntimeException如下:
ArithmeticException:數(shù)學計算異常。
NullPointerException:空指針異常。
NegativeArraySizeException:負數(shù)組長度異常。
ArrayOutOfBoundsException:數(shù)組索引越界異常。
ClassNotFoundException:類文件未找到異常。
ClassCastException:造型異常。第一節(jié)異常和異常處理(3)其他異常:包括用Class.forName()來初始化一個類,字符串參數(shù)或?qū)念惒淮嬖诘?。常見的其他異常如下?/p>
ClassCastException:類型轉(zhuǎn)換異常。
ArrayStoreException:數(shù)組中包含不兼容的值拋出的異常。
SQLException:操作數(shù)據(jù)庫異常。
NoSuchFieldException:字段未找到異常。
NoSuchMethodException:方法未找到拋出的異常。
NumberFormatException:字符串轉(zhuǎn)換為數(shù)字拋出的異常。
StringIndexOutOfBoundsException:字符串索引超出范圍拋出的異常。
IllegalAccessException:不允許訪問某類異常。
InstantiationException:當應用程序試圖使用Class類中的newInstance()方法創(chuàng)建一個類的實例,而指定的類對象無法被實例化時,則拋出該異常。第一節(jié)異常和異常處理一,try語句不能單獨存在,可以和catch、finally組成try-catch-finally、try-catch-try、finally三種結(jié)構(gòu);catch語句可以有一個或多個;finally語句最多一個;try、catch、finally這三個關鍵字均不能單獨使用。第二,try、catch、finally三個代碼塊中變量的作用域分別獨立且不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。第一節(jié)異常和異常處理3.異常處理的語法規(guī)則第三,存在多個catch塊時,Java虛擬機會匹配其中一個異常類或其子類,來執(zhí)行這個catch塊,而不會再執(zhí)行別的catch塊。第四,throw語句后不允許緊跟其他語句,因為這些語句沒有機會執(zhí)行。第五,如果一個方法調(diào)用了另外一個聲明拋出異常的方法,那么這個方法要么處理異常,要么聲明拋出。第一節(jié)異常和異常處理首先,看這樣一個程序:publicclassExceptionTest{publicstaticvoidmain(Stringargs[]){inta=12,b=0;
intd;
d=a/b;
System.out.println(a+"/"+b+"="+d);
}}第一節(jié)異常和異常處理五、一個異常處理的實例這個程序中,b變量的值是0,但是它卻是除數(shù),所以這個程序不能運行。此時,將異常處理加入該程序,修改后的程序如下:publicclassExceptionTest{publicstaticvoidmain(Stringargs[]){try{inta=12,b=0;
intd;
d=a/b;
System.out.println(a+"/"+b+"="+d);
}第一節(jié)異常和異常處理catch(arithmeticexceptione){system.out.println("零不能做除數(shù)哦!");
}}}當有異常處理的時候,程序發(fā)生了除零異常,這將會被catch(arithmeticexceptione)捕捉到,從而輸出提示語句“零不能做除數(shù)哦!”。這樣,程序適應性更強了,也更友好了。第一節(jié)異常和異常處理第二節(jié)Java語言概述第二節(jié)異常處理語句在Java中,異常一般通過try-catch語句來捕獲。其語法格式如下:try{//可能會發(fā)生異常的程序代碼}catch(Type1id1){
//捕獲并處置try拋出的異常類型Type1}catch(Type2id2){//捕獲并處置try拋出的異常類型Type2}第二節(jié)異常處理語句一、try-catch語句關鍵字try后的一對大括號將一塊可能發(fā)生異常的代碼包起來,稱為監(jiān)控區(qū)域。Java方法在運行過程中出現(xiàn)異常,則創(chuàng)建異常對象。將異常拋出監(jiān)控區(qū)域之外,由Java運行時系統(tǒng)試圖尋找匹配的catch子句以捕獲異常。若有匹配的catch子句,則運行其異常處理代碼,try-catch語句結(jié)束。匹配的原則:如果拋出的異常對象屬于catch子句的異常類,或者屬于該異常類的子類,則認為生成的異常對象與catch塊捕獲的異常類型相匹配。第二節(jié)異常處理語句【示例6.1】捕捉throw語句拋出的“除數(shù)為0”的異常。publicclassTestException{publicstaticvoidmain(String[]args){inta=6;
intb=0;
try{//try監(jiān)控區(qū)域第二節(jié)異常處理語句if(b==0)thrownewArithmeticException();//通過throw語句拋出異常
System.out.println("a/b的值是:"+a/b);
}catch(ArithmeticExceptione){//catch捕捉異常
System.out.println("程序出現(xiàn)異常,變量b不能為0。");
}System.out.println("程序正常結(jié)束。");
}}運行結(jié)果:程序出現(xiàn)異常,變量b不能為0。程序正常結(jié)束。第二節(jié)異常處理語句本示例中,在try監(jiān)控區(qū)域通過if語句進行判斷,當“除數(shù)為0”的錯誤條件成立時引發(fā)ArithmeticException異常,創(chuàng)建ArithmeticException異常對象,并由throw語句將異常拋給Java運行時系統(tǒng),由系統(tǒng)尋找匹配的異常處理器catch并運行相應異常處理代碼,打印輸出“程序出現(xiàn)異常,變量b不能為0。”try-catch語句結(jié)束,繼續(xù)程序流程。事實上,“除數(shù)為0”等于ArithmeticException,是RuntimException的子類。而運行時異常將由運行時系統(tǒng)自動拋出,不需要使用throw語句。第二節(jié)異常處理語句在Java中,異常一般通過try-catch語句來捕獲。其語法格式如下:try{//可能會發(fā)生異常的程序代碼}catch(Type1id1){
//捕獲并處置try拋出的異常類型Type1}catch(Type2id2){//捕獲并處置try拋出的異常類型Type2}第二節(jié)異常處理語句二、try-catch-finally語句{//無論是否發(fā)生異常,都將執(zhí)行的語句塊}try塊:用于捕獲異常。其后可接零個或多個catch塊。如果沒有catch塊,則必須跟一個finally塊。catch塊:用于處理try捕獲到的異常。finally塊:無論是否捕獲或處理異常,finally塊里的語句都會被執(zhí)行。第二節(jié)異常處理語句三個語句塊的執(zhí)行順序如下:(1)?try沒有捕獲到異常的情況:try語句塊中的語句逐一被執(zhí)行,程序?qū)⑻^catch語句塊,執(zhí)行finally語句塊和其后的語句。(2)?try捕獲到異常,但catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現(xiàn)異常,卻沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執(zhí)行,但finally語句塊后的語句不會被執(zhí)行。第二節(jié)異常處理語句(3)?try捕獲到異常,且catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執(zhí)行的,當執(zhí)行到某一條語句出現(xiàn)異常時,程序?qū)⑻絚atch語句塊,并與catch語句塊逐一匹配,找到與之對應的處理程序,其他的catch語句塊將不會被執(zhí)行,而try語句塊中出現(xiàn)異常之后的語句也不會被執(zhí)行,catch語句塊執(zhí)行完后執(zhí)行finally語句塊里的語句,最后執(zhí)行finally語句塊后的語句。第二節(jié)異常處理語句【示例6.5】除零異常。publicclassExceptionTest{publicstaticvoidmain(Stringargs[]){try{inta=12,b=0;
intd;d=a/b;
System.out.println(a+"/"+b+"="+d);
}第二節(jié)異常處理語句catch(arithmeticexceptione){system.out.println("零不能做除數(shù)哦!");
}finally{system.out.println("感謝使用本程序!");
}}}運行結(jié)果:零不能做除數(shù)哦!感謝使用本程序!大家也可以嘗試將b變量改成1,看看運行結(jié)果是什么。第二節(jié)異常處理語句throw語句用來明確地拋出一個異常,然后在包含它的所有try塊中從內(nèi)向外尋找與其匹配的catch語句塊。程序員可以控制異常拋出的時機,在認為有異常發(fā)生的時候,可以通過throw手動地拋出異常。throw關鍵字拋出的對象必須是Throwable類型的對象。第二節(jié)異常處理語句三、throw語句【示例6.6】一個throw的實例。publicclassThrowDemo{publicstaticvoidmain(String[]args)throwsException{//TODOAuto-generatedmethodstubinta=-1;
if(a<0){thrownewException("請輸入正數(shù)!");
}}}第二節(jié)異常處理語句【示例6.6】一個throw的實例。publicclassThrowDemo{publicstaticvoidmain(String[]args)throwsException{//TODOAuto-generatedmethodstubinta=-1;
if(a<0){thrownewException("請輸入正數(shù)!");
}}}之前的程序,異常都是Java自動拋出的,而本示例中的程序,如果a小于0,那么將手動地拋出一個異常。第二節(jié)異常處理語句如果一個方法可能導致異常但又不想處理它,此
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)自卸車租賃服務協(xié)議(2024版)版B版
- 二零二五年度鋼材現(xiàn)貨及期貨交易代理合同3篇
- 二零二五年度地磚供貨與旅游度假區(qū)合同3篇
- 2024版拓展訓練合同范本大全
- 濰坊醫(yī)學院《阿拉伯文學選讀》2023-2024學年第一學期期末試卷
- 天津工業(yè)大學《土木水利(建筑與土木工程)領域論文寫作指導》2023-2024學年第一學期期末試卷
- 泰山護理職業(yè)學院《音樂會實踐(2)》2023-2024學年第一學期期末試卷
- 2025年度旅游線路開發(fā)居間服務合同范本6篇
- 2025年度船舶動力系統(tǒng)研發(fā)與建造合同3篇
- 二零二五年度高效節(jié)能蔬菜大棚租賃合同3篇
- 小兒甲型流感護理查房
- 霧化吸入療法合理用藥專家共識(2024版)解讀
- 寒假作業(yè)(試題)2024-2025學年五年級上冊數(shù)學 人教版(十二)
- 銀行信息安全保密培訓
- 市政道路工程交通疏解施工方案
- 2024年部編版初中七年級上冊歷史:部分練習題含答案
- 拆遷評估機構(gòu)選定方案
- 床旁超聲監(jiān)測胃殘余量
- 上海市松江區(qū)市級名校2025屆數(shù)學高一上期末達標檢測試題含解析
- 綜合實踐活動教案三上
- 《新能源汽車電氣設備構(gòu)造與維修》項目三 新能源汽車照明與信號系統(tǒng)檢修
評論
0/150
提交評論