




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、,第6章 異常處理機(jī)制,內(nèi)容摘要,一個(gè)優(yōu)秀的程序,不只是它能夠?qū)崿F(xiàn)強(qiáng)大的功能,而且還要看程序本身有沒(méi)有相應(yīng)錯(cuò)誤處理機(jī)制。我們知道,程序中的漏洞(Bug)總無(wú)處不在,即使我們認(rèn)為程序中應(yīng)該沒(méi)有錯(cuò)誤了,漏洞總會(huì)在某個(gè)時(shí)候鉆出來(lái)困擾我們。面對(duì)程序中各種層出不窮的各類(lèi)錯(cuò)誤,Java提供了異常處理機(jī)制來(lái)協(xié)助開(kāi)發(fā)人員處理各種可能出現(xiàn)的錯(cuò)誤。 在本章中,將會(huì)介紹字符串Java異常概念、異常處理機(jī)制和自定義異常。,學(xué)習(xí)目標(biāo),掌握異常概念 掌握異常組織結(jié)構(gòu) 熟練掌握try-catcht語(yǔ)句捕獲異常 掌握多個(gè)catch語(yǔ)句使用 熟練掌握try-catch語(yǔ)句嵌套 掌握f(shuō)inally語(yǔ)句 掌握異常拋出和聲明 掌握自
2、定義異常創(chuàng)建和使用,6.1 異常,對(duì)于一個(gè)程序來(lái)說(shuō),可能會(huì)發(fā)生三種錯(cuò)誤,語(yǔ)法錯(cuò)誤、運(yùn)行時(shí)錯(cuò)誤和邏輯錯(cuò)誤。語(yǔ)法錯(cuò)誤的產(chǎn)生是在我們編寫(xiě)代碼的過(guò)程可能輸入的字符錯(cuò)誤,不符合相應(yīng)的命令格式等。運(yùn)行時(shí)錯(cuò)誤是程序在運(yùn)行中出現(xiàn)意料不到情況,如除數(shù)為零,數(shù)組越界等。邏輯錯(cuò)誤是程序的運(yùn)行結(jié)果和我們預(yù)想的結(jié)果不一致,這是一種難以調(diào)試的錯(cuò)誤。使用Java的異常處理機(jī)制主要是處理運(yùn)行時(shí)的錯(cuò)誤,異常就是運(yùn)行時(shí)錯(cuò)誤。,6.1.1 異常概念,在Java語(yǔ)言中,異常又稱(chēng)為例外,是運(yùn)行時(shí)錯(cuò)誤。由于Java程序是在網(wǎng)絡(luò)環(huán)境下運(yùn)行的,因此,安全應(yīng)當(dāng)是首要考慮的因素。為了能夠及時(shí)有效地處理程序中的運(yùn)行錯(cuò)誤,Java專(zhuān)門(mén)引入了異常類(lèi)和
3、異常類(lèi)層次。 產(chǎn)生異常的原因有三種: 第一種是Java內(nèi)部錯(cuò)誤發(fā)生時(shí),Java虛擬機(jī)產(chǎn)生的異常。 第二種是編寫(xiě)的程序代碼中的錯(cuò)誤所產(chǎn)生的異常。 第三種是通過(guò)throw語(yǔ)句手動(dòng)生成的異常,這種異常稱(chēng)為“檢查的異常”,一般被用來(lái)告知該方法的調(diào)用者一些必要的信息。,6.1.1 異常概念,Java通過(guò)面向?qū)ο蟮姆椒▉?lái)處理異常。在一個(gè)方法的運(yùn)行過(guò)程中,如果發(fā)生了異常,則這個(gè)方法產(chǎn)生代表該異常的一個(gè)對(duì)象,并把它交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)尋找相應(yīng)的代碼來(lái)處理這一異常。我們把生成異常對(duì)象,并把它提交給運(yùn)行時(shí)系統(tǒng)的過(guò)程稱(chēng)為拋出(throw)一個(gè)異常。運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧中查找,直到找到能夠處理該類(lèi)型異常的對(duì)
4、象,這一個(gè)過(guò)程稱(chēng)為捕獲(catch)一個(gè)異常。,6.1.2 Java異常類(lèi)組織結(jié)構(gòu),在Java中,任何異常對(duì)象都是java.lang.Throwablel類(lèi)或其子類(lèi)的對(duì)象,即所有異常類(lèi)型都是內(nèi)置類(lèi)Throwable的子類(lèi)。因此,Throwable在異常類(lèi)層次結(jié)構(gòu)的頂層。緊接著Throwable下面的是把異常分成兩個(gè)不同分支的子類(lèi):Exception和Error。如圖6-1所示:,6.1.2 Java異常類(lèi)組織結(jié)構(gòu),圖6-1 異常結(jié)構(gòu)圖,6.2 異常處理機(jī)制,Java中處理異常,有兩種方式,一種積極的處理異常的方式,一種是消極的處理異常的方法,二者各自用在不同的場(chǎng)合。積極的處理異常的方式,主要是
5、使用try-catch語(yǔ)句來(lái)解決問(wèn)題,其流程如下:當(dāng)程序中拋出一個(gè)異常后,程序從程序中導(dǎo)致異常的代碼處跳出,java虛擬機(jī)檢測(cè)尋找和try關(guān)鍵字匹配的處理該異常的catch塊,如果找到,將控制權(quán)交到catch塊中的代碼,然后繼續(xù)往下執(zhí)行程序,try塊中發(fā)生異常的代碼不會(huì)被重新執(zhí)行。如果沒(méi)有找到處理該異常的catch塊,在所有的finally塊代碼被執(zhí)行和當(dāng)前線程的所屬的ThreadGroup的uncaughtException方法被調(diào)用后,遇到異常的當(dāng)前線程被終止。遇到異常,就會(huì)馬上處理。消極的異常處理方式,主要是利用throw和throws關(guān)鍵字實(shí)現(xiàn),throw表示主動(dòng)拋出一個(gè)異常,手動(dòng)中止
6、程序運(yùn)行,throws關(guān)鍵字用在方法的后面表示聲明一個(gè)異常,告訴使用該方法的使用者方法具有那些異常,使用者可以根據(jù)自己的情況處理這些聲明的異常。,6.2.1 try-catch語(yǔ)句捕獲異常,在Java中,通常是采用try-catch語(yǔ)句捕獲異常并處理。捕獲異常是一種積極的處理異常的方式。語(yǔ)法如下: try statement_block1 catch(Throwable throwableObj) statement_block2 ,6.2.1 try-catch語(yǔ)句捕獲異常,statement_block1代碼塊可能會(huì)拋出一個(gè)或多個(gè)異常。catch語(yǔ)句的參數(shù)類(lèi)似于方法的聲明,包括一個(gè)異常類(lèi)型
7、和一個(gè)異常對(duì)象。異常類(lèi)型必須為T(mén)hrowable類(lèi)的子類(lèi),它指明了catch語(yǔ)句可以處理的異常類(lèi)型,異常對(duì)象則由運(yùn)行時(shí)系統(tǒng)在try語(yǔ)句代碼塊statement_block1中生成并被捕獲。statement_block2語(yǔ)句塊是在產(chǎn)生異常時(shí)所采取的措施,其中可以調(diào)用異常對(duì)象的方法。catch語(yǔ)句可以有多個(gè),分別處理不同類(lèi)型的異常。 如果在try塊內(nèi)產(chǎn)生異常,則會(huì)將此異常對(duì)象交給Java運(yùn)行系統(tǒng)。此時(shí)Java運(yùn)行時(shí)系統(tǒng)從上到下分別對(duì)每個(gè)catch語(yǔ)句處理的異常類(lèi)型進(jìn)行檢測(cè),直到檢測(cè)到第一個(gè)類(lèi)型相匹配的catch語(yǔ)句為止。類(lèi)型匹配是指catch所處理的異常類(lèi)型與生成的異常對(duì)象的類(lèi)型完全一致,或者是
8、生成異常對(duì)象的父類(lèi),因此,catch語(yǔ)句的排列順序應(yīng)該是從特殊到一般。,6.2.1 try-catch語(yǔ)句捕獲異常,一個(gè)catch語(yǔ)句也可以捕捉多個(gè)異常類(lèi)型,這時(shí)它的異常類(lèi)型參數(shù)應(yīng)該是這多個(gè)異常類(lèi)型的父類(lèi),程序設(shè)計(jì)中要根據(jù)具體的情況來(lái)選擇catch語(yǔ)句的異常處理類(lèi)型。,6.2.2 多個(gè)catch語(yǔ)句,在某些情況下,某個(gè)代碼塊可能拋出多個(gè)異常。處理這種情況,可以定義兩個(gè)或更多的catch子句,每個(gè)子句捕獲一種類(lèi)型的異常。當(dāng)拋出異常時(shí),每一個(gè)catch子句被依次檢查,第一個(gè)匹配異常類(lèi)型的catch子句將被執(zhí)行,而其他的catch子句不被執(zhí)行。當(dāng)該catch語(yǔ)句執(zhí)行以后,接著執(zhí)行trycatch語(yǔ)句
9、塊后面的語(yǔ)句。 當(dāng)用多catch語(yǔ)句時(shí),catch語(yǔ)句塊在次序上有先后之分。這是因?yàn)閺淖钋懊娴腸atch語(yǔ)句塊依次先后進(jìn)行異常類(lèi)型匹配。這樣,如果父異常類(lèi)在子異常類(lèi)之前,那么首先匹配的將是父異常類(lèi),子異常類(lèi)將不會(huì)獲得進(jìn)行匹配的機(jī)會(huì),也即子異常類(lèi)型所在的catch語(yǔ)句將是不可到達(dá)的語(yǔ)句。Java中不可到達(dá)的代碼是一個(gè)錯(cuò)誤。,6.2.3 try-catch語(yǔ)句嵌套,try語(yǔ)句可以被嵌套。也就是說(shuō),一個(gè)try語(yǔ)句可以在另一個(gè)try塊內(nèi)部。每次進(jìn)入try語(yǔ)句,異常的前后關(guān)系都會(huì)被推入堆棧。如果一個(gè)內(nèi)部的try語(yǔ)句不含特殊異常的catch處理程序,堆棧將彈出,下一個(gè)try語(yǔ)句的catch處理程序?qū)z查是
10、否與之匹配。這個(gè)過(guò)程將繼續(xù)直到一個(gè)catch語(yǔ)句匹配成功,或者是直到所有的嵌套try語(yǔ)句被檢查耗盡。如果沒(méi)有catch語(yǔ)句匹配,Java的運(yùn)行時(shí)系統(tǒng)將處理這個(gè)異常。,6.2.4 finally語(yǔ)句,finally關(guān)鍵字是對(duì)Java異常處理模型的最佳補(bǔ)充。finally結(jié)構(gòu)使代碼總會(huì)執(zhí)行,而不管有無(wú)異常發(fā)生。使用finally可以維護(hù)對(duì)象的內(nèi)部狀態(tài),并可以清理非內(nèi)存資源。finally語(yǔ)句和try語(yǔ)句一起使用,基本語(yǔ)法如下: try statement_block1 catch(Throwable throwableObj) statement_block2 finally statement_
11、block3 ,6.2.4 finally語(yǔ)句,一般情況下,無(wú)論是否有異常拋出,都會(huì)執(zhí)行finally語(yǔ) 句塊中的語(yǔ)句,流程示意圖如圖6-6所示: 圖6-6 trycatchfinally流程示意圖,6.2.4 finally語(yǔ)句,如果異常被拋出,finally甚至是在沒(méi)有與該異常相匹配的catch子句情況下也將執(zhí)行。trycatchfinally語(yǔ)句塊的執(zhí)行情況可以細(xì)分為以下三種情況: 如果try代碼塊中沒(méi)有拋出異常,則執(zhí)行完try代碼塊之后直接執(zhí)行finally代碼塊,然后執(zhí)行trycatchfinally語(yǔ)句塊之后的語(yǔ)句。 如果try代碼塊中拋出異常,并被catch子句捕捉到,那么在拋出
12、異常的地方終止try代碼塊的執(zhí)行,轉(zhuǎn)而執(zhí)行相匹配的catch代碼塊,之后執(zhí)行finally代碼塊。如果finally代碼塊中沒(méi)有拋出異常,則繼續(xù)執(zhí)行trycatchfinally語(yǔ)句塊之后的語(yǔ)句;如果finally代碼塊中拋出異常,則把該異常傳遞給該方法的調(diào)用者。 如果try代碼塊中拋出的異常沒(méi)有被任何catch子句捕捉到,那么將直接執(zhí)行finally代碼塊中的語(yǔ)句,并把該異常傳遞給該方法的調(diào)用者。,6.2.4 finally語(yǔ)句,finally語(yǔ)句塊必須與try或try/catch語(yǔ)句塊配合使用。如果finally塊存在,則它總會(huì)執(zhí)行。但是如果代碼在try內(nèi)部執(zhí)行一條System.exit(
13、0);語(yǔ)句,則應(yīng)用程序?qū)⒔K止而不會(huì)執(zhí)行finally語(yǔ)句塊。,6.2.5 拋出和聲明異常,到目前為止,只是獲取了被Java運(yùn)行時(shí)系統(tǒng)拋出的異常,并在catch塊中進(jìn)行處理。除了捕獲異常外,我們還可以在程序中主動(dòng)拋出異常和聲明異常。 拋出異常 程序使用throw語(yǔ)句拋出異常。throw語(yǔ)句的通常形式如下: throw ThrowableInstance;,6.2.5 拋出和聲明異常,聲明異常 有兩種可以處理Throwable對(duì)象的方法:一種是使用trycatch語(yǔ)句;另一種是使用throws關(guān)鍵字聲明異常。 如果一個(gè)方法可以導(dǎo)致一個(gè)異常但該方法并不處理該異常,那么該方法使用throws子句來(lái)聲明該異常。含有throws子句的基本形式的方法聲明如下: ret-type methName(param-list) throws except-list /方法體 ,6.2.5 拋出和聲明異常,一個(gè)throws子句列舉了一個(gè)方法可能拋出的所有異常類(lèi)型,各個(gè)異常類(lèi)型之間使用逗號(hào)分割。凡是Error或RuntimeException子類(lèi)的異常都不需要在異常列表中指定,而其他類(lè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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 振動(dòng)工具作用下的鉆柱振動(dòng)傳遞研究
- 超市庫(kù)存管理案例
- 視光中心年終總結(jié)及計(jì)劃
- 幼兒冬季火災(zāi)防控主題教育
- 2025年碳纖維正交三向織物合作協(xié)議書(shū)
- 2025至2031年中國(guó)大扁圓雙脈沖爆閃警示燈行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 項(xiàng)目預(yù)算保密協(xié)議書(shū)(2篇)
- 2025年中國(guó)汽車(chē)研發(fā)行業(yè)政策、市場(chǎng)規(guī)模及投資前景研究報(bào)告(智研咨詢(xún)發(fā)布)
- 2025至2031年中國(guó)純水主機(jī)行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)直線型仰臥起坐板行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025軌道交通工程周邊環(huán)境調(diào)查與評(píng)價(jià)規(guī)程
- DL∕T 1928-2018 火力發(fā)電廠氫氣系統(tǒng)安全運(yùn)行技術(shù)導(dǎo)則
- 三年級(jí)數(shù)學(xué)下冊(cè)一兩位數(shù)乘兩位數(shù)的乘法2問(wèn)題解決作業(yè)課件西師大版
- 《交通事故車(chē)輛及財(cái)物損失價(jià)格鑒證評(píng)估技術(shù)規(guī)范》
- 中國(guó)嗜酸性粒細(xì)胞增多癥診斷和治療指南(2024版)解讀
- 《基于mRNA-LNP技術(shù)的(細(xì)胞)免疫治療產(chǎn)品開(kāi)發(fā)指南》征求意見(jiàn)稿
- LYT 2085-2013 森林火災(zāi)損失評(píng)估技術(shù)規(guī)范
- 2024兩人合伙人合作簡(jiǎn)單協(xié)議書(shū)范本
- 中國(guó)的地理實(shí)踐教學(xué)
- 《跟上兔子》繪本五年級(jí)第1季A-Magic-Card
- 建筑擋煙垂壁設(shè)計(jì)圖集
評(píng)論
0/150
提交評(píng)論