Java語(yǔ)言:異常處理_第1頁(yè)
Java語(yǔ)言:異常處理_第2頁(yè)
Java語(yǔ)言:異常處理_第3頁(yè)
Java語(yǔ)言:異常處理_第4頁(yè)
Java語(yǔ)言:異常處理_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

10.異常處理本章要點(diǎn)異常處理的意義使用try...catch...finally異常的繼承體系Checked異常與Runtime異常throws與throw自定義異常異常跟蹤棧異常概述異常處理已經(jīng)成為衡量一門語(yǔ)言是否成熟的標(biāo)準(zhǔn)之一,目前的主流編程語(yǔ)言如C++、C#、Ruby、Python等,大都提供了異常處理機(jī)制。增加了異常處理機(jī)制后的程序有更好的容錯(cuò)性,更加健壯。傳統(tǒng)錯(cuò)誤處理的缺陷傳統(tǒng)錯(cuò)誤處理機(jī)制,主要如下兩個(gè)缺點(diǎn):無(wú)法窮舉所有異常情況:因?yàn)槿祟愔R(shí)的限制,異常情況總比可以考慮到的情況多,總有“漏網(wǎng)之魚”的異常情況,所以程序總是不夠健壯。錯(cuò)誤處理代碼和業(yè)務(wù)實(shí)現(xiàn)代碼混雜:這種錯(cuò)誤處理和業(yè)務(wù)實(shí)現(xiàn)混雜的代碼嚴(yán)重影響程序的可讀性,會(huì)增加程序維護(hù)的難度。使用try...catch捕獲異常執(zhí)行try塊里的業(yè)務(wù)邏輯代碼時(shí)出現(xiàn)異常,系統(tǒng)自動(dòng)生成一個(gè)異常對(duì)象,該異常對(duì)象被提交給Java運(yùn)行時(shí)環(huán)境,這個(gè)過(guò)程被稱為拋出(throw)異常。Java運(yùn)行時(shí)環(huán)境收到異常對(duì)象時(shí),會(huì)尋找能處理該異常對(duì)象的catch塊,如果找到合適的catch塊并把該異常對(duì)象交給該catch塊處理,那這個(gè)過(guò)程被稱為捕獲(catch)異常;如果Java運(yùn)行時(shí)環(huán)境找不到捕獲異常的catch塊,則運(yùn)行時(shí)環(huán)境終止,Java程序也將退出。異常的捕捉流程Java的異常體系訪問(wèn)異常信息如果程序需要在catch塊中訪問(wèn)異常對(duì)象的相關(guān)信息,可以通過(guò)調(diào)用catch后異常形參的方法來(lái)獲得。當(dāng)Java運(yùn)行時(shí)決定調(diào)用某個(gè)catch塊來(lái)處理該異常對(duì)象時(shí),會(huì)將該異常對(duì)象賦給catch塊后的異常參數(shù),程序就可以通過(guò)該參數(shù)來(lái)獲得該異常的相關(guān)信息。所有異常對(duì)象都包含了如下幾個(gè)常用方法:getMessage():返回該異常的詳細(xì)描述字符串。printStackTrace():將該異常的跟蹤棧信息輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出。printStackTrace(PrintStreams):將該異常的跟蹤棧信息輸出到指定輸出流。getStackTrace():返回該異常的跟蹤棧信息。異常處理try{

需要檢測(cè)的代碼;}catch(異常類變量){

異常處理代碼;}finally{

一定會(huì)執(zhí)行的代碼; }Finally代碼塊只有一種情況不會(huì)被執(zhí)行。就是在之前執(zhí)行了System.exit(0)。Java7提供的多異常捕捉在Java7以前,每個(gè)catch塊只能捕捉一個(gè)異常。從Java7開始,一個(gè)catch塊可以捕捉多個(gè)異常。catch(異常1|異常2|異常3ex){}多個(gè)異常之間用豎線隔開。多異常捕捉時(shí),異常變量之前有隱式final修飾。使用finally回收資源程序在try塊里打開了一些物理資源(例如數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)連接和磁盤文件等),這些物理資源都必須顯式回收。為了保證一定能回收try塊中打開的物理資源,異常處理機(jī)制提供了finally塊。不管try塊中的代碼是否出現(xiàn)異常,也不管哪一個(gè)catch塊被執(zhí)行,finally塊總會(huì)被執(zhí)行。異常處理的嵌套異常處理流程代碼可以放在任何能放可執(zhí)行性代碼的地方,因此完整的異常處理流程既可放在try塊里,也可放在catch塊里,也可放在finally塊里。異常處理嵌套的深度沒(méi)有很明確的限制,但通常沒(méi)有必要使用超過(guò)兩層的嵌套異常處理,層次太深的嵌套異常處理沒(méi)有太大不要,而且導(dǎo)致程序可讀性降低。Java7的自動(dòng)關(guān)閉資源的try語(yǔ)句try(//此處聲明的資源,系統(tǒng)可以自動(dòng)關(guān)閉它。){//}對(duì)于自動(dòng)關(guān)閉資源的try語(yǔ)句,可以沒(méi)有catch和finally——try塊可以孤獨(dú)地存在。自動(dòng)關(guān)閉資源的try語(yǔ)句,有兩個(gè)注意點(diǎn):只有放在try后面的圓括號(hào)里的資源才會(huì)被關(guān)閉。能被自動(dòng)關(guān)閉的資源必須實(shí)現(xiàn)Closeable或AutoCloseable接口。Checked異常與Runtime異常Java的異常被分為兩大類:Checked異常和Runtime異常(運(yùn)行時(shí)異常)。所有RuntimeException類及其子類的實(shí)例被稱為Runtime異常;不是RuntimeException類及其子類的異常實(shí)例則被稱為Checked異常。Checked異常的處理當(dāng)前方法明確知道如何處理該異常,程序應(yīng)該使用try...catch塊來(lái)捕獲該異常,然后在對(duì)應(yīng)的catch塊中修改該異常。例如前面介紹的五子棋游戲中處理用戶輸入不合法的異常,程序在catch塊中打印對(duì)用戶的提示信息,重新開始下一次循環(huán)。當(dāng)前方法不知道如何處理這種異常,應(yīng)該在定義該方法時(shí)聲明拋出該異常。Runtime異常的處理Runtime異常則更加靈活,Runtime異常無(wú)需顯式聲明拋出。如果程序需要捕捉Runtime異常,也可以使用try...catch塊來(lái)捕捉Runtime異常。使用throws聲明拋出異常throws聲明拋出異常的思路是:當(dāng)前方法不知道應(yīng)該如何這種類型的異常,該異常應(yīng)該由上一級(jí)調(diào)用者處理,如果main方法也不知道應(yīng)該如何處理這種類型的異常,也可以使用throws聲明拋出異常,該異常將交給JVM處理。JVM對(duì)異常的處理方法是:打印異常跟蹤棧信息,并中止程序運(yùn)行,這就是前面程序在遇到異常后自動(dòng)結(jié)束的原因。throws聲明拋出只能在方法簽名中使用,throws可以聲明拋出多個(gè)異常類,多個(gè)異常類之間以逗號(hào)隔開。throws聲明拋出的語(yǔ)法格式如下throwsExceptionClass1,ExceptionClass2...拋出異常如果需要在程序中自行拋出異常,應(yīng)使用throw語(yǔ)句,throw語(yǔ)句可以單獨(dú)使用,throw語(yǔ)句拋出的不是異常類,而是一個(gè)異常實(shí)例,而且每次只能拋出一個(gè)異常實(shí)例。throw語(yǔ)句的語(yǔ)法格式如下:throwExceptionInstance;如果throw語(yǔ)句拋出的異常是Checked異常,則該throw語(yǔ)句要么處于try塊里,顯式捕獲該異常,要么放在一個(gè)帶throws聲明拋出的方法中,即把該異常交給該方法的調(diào)用者處理。Java7增強(qiáng)的throw語(yǔ)句try{newFileInputStream(“a.txt”);}Catch(Exceptionex){ex.printStackTrace();throwex;//①}從JDK7開始,Java編譯器可以只能地識(shí)別①號(hào)代碼處拋出的異常只是FileNotFoundException異常。自定義異常類,程序很少會(huì)自行拋出系統(tǒng)異常,因?yàn)楫惓5念惷ǔ0嗽摦惓5挠杏眯畔ⅰK栽谶x擇拋出什么異常時(shí),應(yīng)該選擇合適的異常類,從而可以明確地描述該異常情況。在這種情形下,應(yīng)用程序常常需要拋出自定義異常。用戶自定義異常都應(yīng)該繼承Exception基類,如果希望自定義Runtime異常,則應(yīng)該繼承RuntimeException基類。定義異常類時(shí)通常需要提供兩種構(gòu)造器:一個(gè)是無(wú)參數(shù)的構(gòu)造器;另一個(gè)是帶一個(gè)字符串參數(shù)的構(gòu)造器,這個(gè)字符串將作為該異常對(duì)象的詳細(xì)說(shuō)明(也就是異常對(duì)象的getMessage方法的返回值)。異常鏈當(dāng)業(yè)務(wù)邏輯層訪問(wèn)持久層出現(xiàn)SQLException異常時(shí),程序不應(yīng)該把底層的SQLException異常傳到用戶界面,原因有如下兩個(gè):對(duì)于正常用戶而言,他們不想看到底層SQLException,SQLException對(duì)他們使用該系統(tǒng)沒(méi)有任何幫助。對(duì)于惡意用戶而言,將SQLException暴露出來(lái)是一種不安全的。Java的異常跟蹤棧異常對(duì)象的printStackTrace方法用于打印異常的跟蹤棧信息,根據(jù)printStackTrace方法的輸出結(jié)果,我們可以找到異常的源頭,并跟蹤到異常一路觸發(fā)的過(guò)程。面向?qū)ο蟮膽?yīng)用程序運(yùn)行時(shí),經(jīng)常會(huì)發(fā)生一系列方法調(diào)用,從而形成“方法調(diào)用棧”,異常的傳播則與相反:只要異常沒(méi)有被完全捕獲(包括異常沒(méi)有被捕獲,或異常被處理后重新拋出了新異常),異常從發(fā)生異常的方法逐漸向外傳播,首先傳給該方法的調(diào)用者,該方法調(diào)用者再次創(chuàng)給其調(diào)用者……直至最后傳到main方法,如果main方法依然沒(méi)有處理該異常,JVM會(huì)中止該程序,并打印異常的跟蹤棧信息。Java的異常跟蹤棧異常對(duì)象的printStackTrace方法用于打印異常的跟蹤棧信息,根據(jù)printStackTrace方法的輸出結(jié)果,我們可以找到異常的源頭,并跟蹤到異常一路觸發(fā)的過(guò)程。面向?qū)ο蟮膽?yīng)用程序運(yùn)行時(shí),經(jīng)常會(huì)發(fā)生一系列方法調(diào)用,從而形成“方法調(diào)用?!?,異常的傳播則與相反:只要異常沒(méi)有被

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論