版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章異?!禞ava面向?qū)ο蟪绦蛟O(shè)計案例教程(第2版)》目錄/Contents6.16.26.3異常的概念異常處理異常類6.4
自定義異常類思政要點(diǎn)/Point公平與公正原則在使用Math類提供的數(shù)學(xué)函數(shù)時,確保算法的公平性和透明度,避免任何可能的偏見或不公平現(xiàn)象。持續(xù)學(xué)習(xí)與適應(yīng)變化
時刻關(guān)注數(shù)據(jù)的安全性,尤其是在處理敏感信息時,確保數(shù)據(jù)的傳輸和存儲符合安全標(biāo)準(zhǔn)異常的概念6.1
異常是因編程錯誤或偶然的外在因素導(dǎo)致的在程序運(yùn)行過程中所發(fā)生的非正常事件,它會中斷指令的正常執(zhí)行。就像人人都希望自己身體健康,處理事情都能順利,但在實際沈國忠綜合遇到各種狀況,如感冒發(fā)燒,工作時電腦藍(lán)屏、系統(tǒng)突然中斷等。同樣,在程序運(yùn)行的過程中,也會發(fā)生各種非正常狀況。下面通過一個例子認(rèn)識一下什么是異常。6.1異常的概念publicclassExample01{publicstaticvoidmain(String[]args){intresult=divide(4,0);//調(diào)用divide()方法System.out.println(result);}//下面的方法實現(xiàn)了兩個整數(shù)相除publicstaticintdivide(intx,inty){intresult=x/y; //定義一個變量result記錄相除的結(jié)果 returnresult; //將結(jié)果返回 }}
上面程序的運(yùn)行結(jié)果如下:6.1異常的概念
因為用0做了除數(shù),則會拋出java.lang.ArithmeticException的異常。異常發(fā)生后,程序會立即結(jié)束,無法繼續(xù)向下執(zhí)行。
Java提供了大量的異常類,這些類都繼承自java.lang.Throwable類。如圖6-2所示。6.1異常的概念
圖6-2Throwable類的繼承體系
異常發(fā)生的類型有很多,通常包含以下四大類。(1)用戶輸入了非法數(shù)據(jù)。(2)要打開的文件不存在。(3)網(wǎng)絡(luò)通信時連接中斷。(4)JVM內(nèi)存溢出。這些現(xiàn)象都會導(dǎo)致程序無法正常運(yùn)行,但是其背后的原因各不相同。6.1異常的概念異常處理6.26.2異常處理異常處理機(jī)制包括以下3種類型。1.檢查性異常(非運(yùn)行時異常,編譯時異常)檢查性異常是由用戶錯誤或問題引起的異常,程序員無法預(yù)見這種異常,如打開一個不存在的文件。這種異常在編譯時不能被忽略。2.運(yùn)行異常運(yùn)行時異常(RuntimeException)是可以被程序員避免的異常。與檢查性異常相反,運(yùn)行時異??梢栽诰幾g時被忽略。換言之,運(yùn)行時異常是代碼中的邏輯問題而不是語法問題導(dǎo)致的。3.錯誤錯誤(Error)不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常不會體現(xiàn),如虛擬機(jī)內(nèi)部錯誤(VirtualMachineError),這個錯誤與程序員編寫的代碼無關(guān)。6.2.1try...catch語句如果程序在執(zhí)行過程中出現(xiàn)異常,則會自動生成一個異常類對象,該異常對象將被提交給Java虛擬機(jī),這個過程稱為拋出(throw)異常。當(dāng)Java虛擬機(jī)接收到異常對象后,會尋找能處理這一異常的代碼并把當(dāng)前異常對象交給其處理,這一過程稱為捕獲(catch)異常,使用try和catch關(guān)鍵字組合可以捕獲異常。如果程序中沒有可以捕獲異常的代碼,則程序運(yùn)行將終止。try...catch代碼塊中的代碼稱為保護(hù)代碼,其格式如下。try{//程序代碼}catch(異常類型異常的變量名){//catch塊}catch語句包含要捕獲異常類型的聲明。當(dāng)try代碼塊中發(fā)生異常時,try后面的catch塊就會被檢查。如果發(fā)生的異常的類型在catch塊中存在,則異常會被傳遞到該catch塊中,這與傳遞一個參數(shù)到方法中是一樣的。6.2.1try...catch語句publicclassExample02{publicstaticvoidmain(Stringargs[]){try{int[]all=newint[2];//拋出異常,進(jìn)入catch代碼塊System.out.println("第三個元素:"+all[3]);//得不到執(zhí)行機(jī)會System.out.println("持續(xù)運(yùn)行中...");}catch(ArrayIndexOutOfBoundsExceptione){//檢查異常類型是否匹配System.out.println("捕獲異常:"+e);//異常類型匹配}System.out.println("Outoftheblock");}}示例代碼6.2.1try...catch語句try{//程序代碼}catch(異常類型1異常的變量名1){//程序代碼}catch(異常類型2異常的變量名2){//程序代碼}catch(異常類型3異常的變量名3){//程序代碼}若try代碼塊中出現(xiàn)多種類型的異常,則顯然一個catch代碼塊無法滿足此情況,因此要使用多重捕獲。一個try代碼塊后面跟隨多個catch代碼塊的情況叫作多重捕獲。多重捕獲的格式如下。6.2.1try...catch語句上述格式中包含了3個catch代碼塊,根據(jù)實際需求,try語句后面可以添加任意數(shù)量的catch代碼塊。多重捕獲的處理邏輯如下:如果try代碼塊中發(fā)生異常,則異常對象會先被拋給第一個catch塊;如果拋出異常的類型與ExceptionType1匹配,則其在此時會被捕獲,從而進(jìn)入第一個catch的代碼塊執(zhí)行;如果不匹配,則異常對象會被傳遞給第二個catch塊并進(jìn)行類型匹配,直到異常被捕獲;如果所有的catch代碼塊都沒有匹配成功,則程序運(yùn)行仍然終止,try...catch代碼塊失效。值得注意的是,在多重捕獲的catch代碼塊中,父類異常類型的判斷一定要在子類異常的判斷之后。6.2.1try...catch語句publicclassExample03{publicstaticvoidmain(Stringargs[]){try{System.out.println(1/0);}catch(NullPointerExceptione){System.out.println("空指針異常");}catch(ArithmeticExceptione){System.out.println("數(shù)學(xué)計算異常");}catch(Exceptione){//Exception不能放在前面先判斷,否則編譯無法通過System.out.println("其他類型異常");}}}示例代碼6.2.2finally子句的用法finally關(guān)鍵字用來修飾在try代碼塊后面執(zhí)行的代碼塊。無論是否發(fā)生異常,finally代碼塊中的代碼都會被執(zhí)行。在finally代碼塊中可以運(yùn)行具有收尾善后性質(zhì)的語句,格式如下。try{//程序代碼}catch(異常類型1異常的變量名1){//程序代碼}catch(異常類型2異常的變量名2){//程序代碼}finally{//程序代碼}6.2.2finally子句的用法publicclassExample04{publicstaticvoidmain(Stringargs[]){int[]all=newint[2];try{System.out.println("Accesselementthree:"+all[3]);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Exceptionthrown:"+e);}finally{//無條件執(zhí)行all[0]=6;System.out.println("Firstelementvalue:"+all[0]);System.out.println("Thefinallystatementisexecuted");}}}示例代碼6.2.3使用throws關(guān)鍵字拋出異常如果一個方法中可能會出現(xiàn)異常,且異常出現(xiàn)時不想在此方法內(nèi)部進(jìn)行捕獲,那么可以將此異常拋出到該方法的調(diào)用位置,即向上拋出異常。使用時只需要在方法后增加"throws要拋出的異常類型”語句即可,示例代碼如下。publicclassExample05{//此方法拋出異常publicvoidmethod()throwsNullPointerException{Strings=null;//下面的代碼會拋出異常,并被method方法繼續(xù)向上層拋出System.out.println("字符串的長度是:"+s.length());}publicstaticvoidmain(Stringargs[]){Example05t=newExample05();try{t.method();//異常被拋出到此處}catch(NullPointerExceptione){System.out.println("在主方法中捕獲異常:"+e);}}}6.2.4使用throw關(guān)鍵字拋出異常為了使代碼更加規(guī)范以便于協(xié)同工作效率的提升,可以在代碼中手動使用throw關(guān)鍵字拋出一個異常對象。手動拋出的異常對象與Java虛擬機(jī)自動拋出的異常對象相同,示例代碼如下。publicclassExample06{publicvoidmethod()throwsNullPointerException{Strings=null;if(s==null)//手動拋出一個空指針異常對象thrownewNullPointerException("String空指針了!");}publicstaticvoidmain(Stringargs[]){Example06t=newExample06();try{t.method();}catch(NullPointerExceptione){System.out.println("在主方法中捕獲異常:"+e);}}}6.2.5使用異常處理語句的注意事項異常處理語句并不是隨意使用的,在使用的過程中有一些事項需要讀者引起注意。(1)try和catch代碼塊必須同時使用。(2)finally代碼塊并非強(qiáng)制性要求。(3)try...catch...finally代碼塊之間不能添加其他代碼。(4)子類中覆蓋方法不能比父類被覆蓋方法拋出更多的異常。(5)雖然異常處理的代碼塊可以嵌套,但是并不建議使用嵌套。(6)對于運(yùn)行時出現(xiàn)的異常,建議從代碼根源邏輯處解決問題,而不是直接使用try...catch代碼塊。(7)如果上層代碼沒有異常處理機(jī)制,那么要在異常拋出的位置直接捕獲異常并處理。異常類6.36.3異常類異常描述ArithmeticException當(dāng)出現(xiàn)異常的運(yùn)算條件時,拋出此異常。例如,一個整數(shù)“除以零”時,拋出此類的一個實例ArrayIndexOutOfBoundsException用非法索引訪問數(shù)組時拋出的異常。如果索引為負(fù)或大于等于數(shù)組大小,則該索引為非法索引ArrayStoreException試圖將錯誤類型的對象存儲到一個對象數(shù)組時拋出的異常ClassCastException當(dāng)試圖將對象強(qiáng)制轉(zhuǎn)換為不是實例的子類時拋出的異常IllegalArgumentException拋出的異常表明向方法傳遞了一個不合法或不正確的參數(shù)IndexOutOfBoundsException指示某排序索引(如對數(shù)組、字符串或向量的排序)超出范圍時拋出的異常NullPointerException當(dāng)應(yīng)用程序試圖在需要對象的地方使用null時,拋出該異常NunmberFormatException當(dāng)應(yīng)用程序試圖將字符串轉(zhuǎn)成一種數(shù)值類型,但該字符串不能轉(zhuǎn)換為適當(dāng)格式時,拋出該異常表6-1各種運(yùn)行時異常類型的詳細(xì)信息6.3異常類異常描述ClassNotFoundException應(yīng)用程序試圖加載類,而找不到相應(yīng)的類時,拋出該異常CloneNotSupportedException當(dāng)調(diào)用Object類中的clone方法克隆對象,但該對象的類無法實現(xiàn)Cloneable接口時,拋出該異常IllegalAccessException絕訪問一個類的時候,拋出該異常InterruptedException當(dāng)一個線程被另一個線程中斷時,拋出該異常NoSuchFieldException請求的變量不存在NoSuchMethodException請求的方法不存在表6-2各種檢查性異常類型的詳細(xì)信息自定義異常類6.46.4自定義異常類classMyExceptionextendsException{//程序代碼}Java中允許用戶自定義異常,編寫自定義異常類時需要注意以下幾點(diǎn)。(1)所有異常都必須是Throwable的子類。(2)如果希望寫
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中國醫(yī)學(xué)科學(xué)院醫(yī)學(xué)生物學(xué)研究所第二批招聘10人考試備考題庫及答案解析
- 深度解析(2026)《GBT 26051-2010硬質(zhì)合金 鈷粉中硫和碳量的測定 紅外檢測法》
- 深度解析(2026)《GBT 25935-2010橡膠硫化罐》(2026年)深度解析
- 深度解析(2026)《GBT 25907.1-2010信息技術(shù) 維吾爾文、哈薩克文、柯爾克孜文編碼字符集 16點(diǎn)陣字型 第1部分:正文白體》
- 深度解析(2026)《GBT 25805-2010還原灰3B(C.I.還原黑16)》(2026年)深度解析
- 2025北京首都醫(yī)科大學(xué)附屬北京同仁醫(yī)院門頭溝醫(yī)院(北京市門頭溝區(qū)醫(yī)院)引進(jìn)高層次醫(yī)療衛(wèi)生技術(shù)人才4人備考考試題庫及答案解析
- 深度解析(2026)GBT 25696-2010道路施工與養(yǎng)護(hù)機(jī)械設(shè)備 瀝青路面加熱機(jī) 術(shù)語和商業(yè)規(guī)格
- 2026廣東中山市教體系統(tǒng)第一期招聘事業(yè)單位人員117人參考筆試題庫附答案解析
- 2025年河北邢臺市人民醫(yī)院公開招聘編外工作人員41名考試筆試模擬試題及答案解析
- 2025中國海洋大學(xué)材料科學(xué)與工程學(xué)院實驗技術(shù)人員招聘1人備考考試題庫及答案解析
- 2025年廣東省第一次普通高中學(xué)業(yè)水平合格性考試(春季高考)英語試題(含答案詳解)
- 2026年合同全生命周期管理培訓(xùn)課件與風(fēng)險防控手冊
- 特殊兒童溝通技巧培訓(xùn)
- 理賠管理經(jīng)驗分享
- 中國馬克思主義與當(dāng)代2024版教材課后思考題答案
- DB44∕T 1297-2025 聚乙烯單位產(chǎn)品能源消耗限額
- 2025年歷城語文面試題目及答案
- 裝修合同三方協(xié)議范本
- 講給老年人聽的助聽器
- 大清包勞務(wù)合同樣本及條款解讀
- 算電協(xié)同產(chǎn)業(yè)園建設(shè)項目可行性研究報告
評論
0/150
提交評論