




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第五講異常什么是異常異常的處理使用預(yù)定義的異常處理的規(guī)則1什么是異常
異常(Exception)是程序執(zhí)行過程中出現(xiàn)的非正常事件,即各種意外情況。比如說:①用戶輸入出錯(cuò)②所需文件找不到③運(yùn)行時(shí)磁盤空間不夠④內(nèi)存不夠⑤算術(shù)運(yùn)算錯(cuò)(數(shù)的溢出,被零除…)⑥數(shù)組下標(biāo)越界……2什么是異常當(dāng)Java程序出現(xiàn)以上的錯(cuò)誤時(shí),就會(huì)在所處的方法中產(chǎn)生一個(gè)異常對象。這個(gè)異常對象包括錯(cuò)誤的類型,錯(cuò)誤出現(xiàn)時(shí)程序的運(yùn)行狀態(tài)以及對該錯(cuò)誤的詳細(xì)描述。3為什么需要異常作為面向?qū)ο蟮木幊陶Z言,Java程序在運(yùn)行過程中遇到的各種異常情況也是通過對象表示的。在軟件中通過一類特殊的對象——異常將這些特殊情況傳遞給使用該軟件包的程序,由其決定如何處理。4異常類的結(jié)構(gòu)ObjectThrowableErrorExceptionRuntimeExceptionIOException5Throwabal類包括兩個(gè)子類:Error和Exception。Error類用于表示一些比較嚴(yán)重的錯(cuò)誤,難以恢復(fù),程序員一般不用處理這些錯(cuò)誤。Exception類一般代表程序設(shè)計(jì)或?qū)崿F(xiàn)方面的問題。Exception類包括兩個(gè)子類:RuntimeException和IOException例8-4。異常類的結(jié)構(gòu)6RuntimeException類所表示的異常,只要程序設(shè)計(jì)沒有問題都不會(huì)產(chǎn)生,對這些異常一般不做處理,以便問題能自然暴露出來。IOException類代表輸入輸出操作產(chǎn)生的異常。這些異常一般是由用戶環(huán)境而非程序本身問題造成的,JDK中一般強(qiáng)制調(diào)用者在使用時(shí)作處理。異常類的結(jié)構(gòu)7異常處理機(jī)制拋出(throw)異常:
在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會(huì)生成一個(gè)異常對象。生成的異常對象將傳遞給Java運(yùn)行時(shí)系統(tǒng),這一異常的產(chǎn)生和提交過程稱為拋出(throw)異常。兩種處理異常的機(jī)制:
聲明拋出異常:
如果一個(gè)方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時(shí),聲明拋出(throws)異常。這是一種消極的異常處理機(jī)制。8異常處理機(jī)制兩種處理異常的機(jī)制:
捕獲異常:
當(dāng)Java運(yùn)行時(shí)系統(tǒng)得到一個(gè)異常對象時(shí),它將會(huì)沿著方法的調(diào)用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型的異常的方法后,運(yùn)行時(shí)系統(tǒng)把當(dāng)前異常對象交給這個(gè)方法進(jìn)行處理,這一過程稱為捕獲(catch)異常。這是積極的異常處理機(jī)制。如果Java運(yùn)行時(shí)系統(tǒng)找不到可以捕獲異常的方法,則運(yùn)行時(shí)系統(tǒng)將終止,相應(yīng)的Java程序也將退出。9
throws異常說明總是和方法說明出現(xiàn)在一起。這樣,方法說明告訴編譯器該方法可能會(huì)產(chǎn)生哪些異常,從而要求它的調(diào)用者必須考慮處理這些異常。帶throws異常說明的方法說明形式如下:
…方法名(…)[throws異常類列表]{方法體}方法拋出的異常類是throws子句中指定的異常類或其子類。
throws拋出異常10
并不是所有可能發(fā)生的異常都要在方法的說明中指定,從Error類中派生出的異常和從RuntimeException類中派生的異常就不用在方法聲明中指定。這兩類異常屬于不檢查異常。不檢查異常則是那些無法干預(yù)的異常。Java中的另一類異常是檢查異常,檢查異常是那些在程序中應(yīng)該處理的異常,程序完全可以避免的異常(比如數(shù)組越界錯(cuò)誤)。而throws異常說明必須指定有可能發(fā)生的檢查異常。throws拋出異常11
在程序中使用throw語句(注意,這里是throw而不是throws)來拋出異常,該異??梢栽谠摮绦蛑羞M(jìn)行捕獲、處理,也可以在調(diào)用該方法者捕獲、處理。
throw語句的形式為:
throw異常類的實(shí)例;throw拋出異常12如何創(chuàng)建和使用異常使用異常可從編寫軟件包者和使用軟件包者兩個(gè)角度來看:編寫軟件包者需要將其難以處理的情況定義為異常類,在軟件包中碰到對應(yīng)的情況時(shí)就創(chuàng)建相應(yīng)的異常對象,并通過關(guān)鍵字throw關(guān)鍵字拋出。軟件包的使用者在使用軟件包時(shí)就可以根據(jù)一定的方法獲得該異常對象,從而知道這是一個(gè)什么樣的情況,并根據(jù)需要作處理了。13異常的捕獲try{
可能產(chǎn)生異常的代碼}catch(異常類型1變量){調(diào)用者對異常的處理}catch(異常類型2變量){調(diào)用者對異常的處理}例8-5。14多個(gè)catch的匹配catch語句的順序:
捕獲異常的順序和catch語句的順序有關(guān),異常對象產(chǎn)生后,將按照次序一個(gè)一個(gè)匹配,一旦匹配成功,其余的catch語句將不再繼續(xù)和其匹配。因此,在安排catch語句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。15
finally語句可以說是為異常處理事件提供的一個(gè)清理機(jī)制,一般是用來關(guān)閉文件或釋放其他的系統(tǒng)資源,作為try-catch-finally結(jié)構(gòu)的一部分,可以沒有finally語句,如果存在finally語句,不論try塊中是否發(fā)生了異常是否執(zhí)行過catch語句,都要執(zhí)行finally語句。finally子句16帶有finally子句的try-catch-finally語句的形式如下:
try
{…}//是正常執(zhí)行的代碼,可能產(chǎn)生異常
catch(異常類1e1)
{…}//異常類1的處理代碼
catch(異常類2e2)
{…}
//異常類2的處理代碼
……
catch(異常類nen)
{…}//異常類n的處理代碼
finally
{…}
//…是執(zhí)行清除工作的語句finally子句17
帶有finally子句的try-catch-finally語句無論在try塊中是否產(chǎn)生異常,也不管產(chǎn)生的異常是否會(huì)被捕獲,finally中的語句最終都會(huì)被執(zhí)行。具體的執(zhí)行過程如下:
(1)try塊中的語句沒有產(chǎn)生異常。在這種情況下,Java首先執(zhí)行try塊中的所有的語句,然后執(zhí)行finally子句中的代碼,最后執(zhí)行try…catch..finally塊后面的語句;
finally子句18
(2)try塊中的語句產(chǎn)生了異常,而且此異常在方法內(nèi)被捕獲。在這種情況下,Java首先執(zhí)行try塊中的語句,直到產(chǎn)生異常處,然后跳過此try塊中剩下的語句,執(zhí)行捕獲此異常的catch子句的處理代碼;然后執(zhí)行finally子句中的代碼;
finally子句19
(3)如果catch子句中沒有重新拋出異常,那么Java將執(zhí)行try…catch…finally塊后面的語句。如果在catch子句又重新拋出了異常,那么Java將這個(gè)異常拋出給方法的調(diào)用者;(4)try塊中產(chǎn)生了異常,而此異常在方法內(nèi)沒有被捕獲。在這種情況下,Java將執(zhí)行try塊中的代碼直到產(chǎn)生異常,然后跳過try塊中的代碼而轉(zhuǎn)去執(zhí)行finally子句中的代碼,最后將異常拋出給方法的調(diào)用者。finally子句20finally中的內(nèi)容總會(huì)執(zhí)行到,甚至當(dāng)try中執(zhí)行到return語句也會(huì)先將finally執(zhí)行完再返回執(zhí)行return。finally總會(huì)執(zhí)行,除了一種情況:程序執(zhí)行到System.exit(),這時(shí)程序會(huì)立刻退出。例8-7。finally子句21方法相互調(diào)用及異常處理規(guī)則程序從main開始執(zhí)行,若其中執(zhí)行了方法go1(),而go1()又調(diào)用了方法go(),在方法go()的語句執(zhí)行時(shí)有異常拋出,則該異常將根據(jù)調(diào)用關(guān)系一層一層向外拋出,直到某個(gè)方法將其捕獲,若所有的方法都為捕獲,則程序?qū)⒎钦M顺觥3绦蛄鞒虉D如下圖所示。例8-8、8-9、8-10。22方法相互調(diào)用及異常處理規(guī)則23強(qiáng)制處理Java中可以在方法(函數(shù))定義中加入throws關(guān)鍵字聲明拋出異常來實(shí)現(xiàn)強(qiáng)制處理。實(shí)現(xiàn)強(qiáng)制處理的方法在使用時(shí)必須對其進(jìn)行異常處理,否則編譯出錯(cuò)。處理的辦法有兩種:1、try…catch語句處理2、在調(diào)用該方法的方法聲明中繼續(xù)聲明拋出異常。例8-12、8-13、8-14、8-15。24用戶定義的異常1、定義Exception子類,代表異常類型2、在適當(dāng)?shù)臅r(shí)候創(chuàng)建并拋出異常對象。3、調(diào)用者處理異常例8-1。25classMyDateException
extendsException
{
privateStringreason;
publicMyDateException(Stringr)
{
reason=r;
}
publicStringgetReason()
{
return(reason);
}}26classMyDate{
int
year,month,day;
voidsetDay(int
y,int
m,intd)throwsMyDateException
{
if(d>31)
{
thrownewMyDateException("daytoobig");
}
}}27classt{publicstaticvoidmain(String
args[]){
MyDatet=newMyDate();
try{
t.setDay(2001,1,100);
}
catch(MyDateException
ee)
{
System.out.println(ee.getReason());
}}}28覆蓋與異常規(guī)定:子類中覆蓋的方法拋出的異常不能比父類被覆蓋的方法拋出更多的異常。解決辦法:子類中覆蓋方法拋出的異常和父類被覆蓋的方法拋出的異常一樣多,或在子類中不拋出異常。例:overriding.java29
由于異常使用起來非常方便,以至于在很多情況下可能會(huì)濫用異常。但是,使用異常處理會(huì)降低程序運(yùn)行的速度,如果在程序中過多地使用異常處理,程序的執(zhí)行速度會(huì)顯著地降低。這里給出幾點(diǎn)建議,來幫助掌握好使用異常處理的尺度。
正確地使用異常30(1)在可以使用簡單的測試就能完成的檢查中,不要使用異常來代替它。例如:
if(ins!=null)
//使用ins引用對象
{…
}(2)不要過細(xì)地使用異常。最好不要到處使用異常,更不要在循環(huán)體內(nèi)使用異常處理,可以將它包裹在循環(huán)體外面.正確地使用異常31(3)不要捕獲了一個(gè)異常而又不對它做任何的處理。如:
try{……//正常執(zhí)行的代碼
}catch(Exceptione){}(4)將異常保留給方法的調(diào)用者并非不好的做法。對于有些異常,將其交給方法的調(diào)用者去處理是一種更好的處理辦法。正確地使用異常32
異常處理把Java程序各種可能出現(xiàn)的錯(cuò)誤都看作異常,集中起來統(tǒng)一處理。程序員只需要說明何處理可能的出現(xiàn)異常,如何處理即可。
throws拋出異常和方法說明聯(lián)系在一起
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)分析基礎(chǔ)(第2版)課件 第5章 數(shù)據(jù)展現(xiàn)
- 江西省南昌市新建二中2025年高二化學(xué)第二學(xué)期期末質(zhì)量檢測試題含解析
- 2025至2030年中國鋁合金型材彎制行業(yè)投資前景及策略咨詢報(bào)告
- 整體護(hù)理題目及答案大全
- 蒸餾化學(xué)實(shí)驗(yàn)題目及答案
- 2025年中國斜調(diào)壓榨機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年中國一體成型資料架行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025屆遼寧省鳳城市高一化學(xué)第二學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 2025屆云南省楚雄州姚安縣一中高二下化學(xué)期末復(fù)習(xí)檢測模擬試題含解析
- 大專數(shù)學(xué)考試題庫及答案
- 事故隱患內(nèi)部報(bào)告獎(jiǎng)勵(lì)制度
- 2024年湖北高中學(xué)業(yè)水平合格性考試物理試卷真題(含答案詳解)
- 北京市大興區(qū)2023-2024學(xué)年八年級(jí)下學(xué)期期末歷史試題(原卷版)
- 養(yǎng)老院排班表
- 營銷學(xué)相關(guān)理論-4P、4C、6P、整合營銷
- 2022-2023年(備考資料)副主任醫(yī)師(副高)-腎內(nèi)科學(xué)(副高)歷年真題精選一含答案試卷4
- 半導(dǎo)體設(shè)備零部件公司質(zhì)量檢驗(yàn)
- 零信任網(wǎng)絡(luò)安全理念的重塑
- 酒店客房部績效考核管理制度
- 勇者斗惡龍怪獸篇joker2專家版中文配合表(附圖)
- 西藥房工作管理制度
評(píng)論
0/150
提交評(píng)論