第五講異常(JAVA網(wǎng)絡(luò)編程技術(shù))_第1頁
第五講異常(JAVA網(wǎng)絡(luò)編程技術(shù))_第2頁
第五講異常(JAVA網(wǎng)絡(luò)編程技術(shù))_第3頁
第五講異常(JAVA網(wǎng)絡(luò)編程技術(shù))_第4頁
第五講異常(JAVA網(wǎng)絡(luò)編程技術(shù))_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五講異常什么是異常異常的處理使用預(yù)定義的異常處理的規(guī)則1什么是異常

異常(Exception)是程序執(zhí)行過程中出現(xiàn)的非正常事件,即各種意外情況。比如說:①用戶輸入出錯②所需文件找不到③運行時磁盤空間不夠④內(nèi)存不夠⑤算術(shù)運算錯(數(shù)的溢出,被零除…)⑥數(shù)組下標(biāo)越界……2什么是異常當(dāng)Java程序出現(xiàn)以上的錯誤時,就會在所處的方法中產(chǎn)生一個異常對象。這個異常對象包括錯誤的類型,錯誤出現(xiàn)時程序的運行狀態(tài)以及對該錯誤的詳細描述。3為什么需要異常作為面向?qū)ο蟮木幊陶Z言,Java程序在運行過程中遇到的各種異常情況也是通過對象表示的。在軟件中通過一類特殊的對象——異常將這些特殊情況傳遞給使用該軟件包的程序,由其決定如何處理。4異常類的結(jié)構(gòu)ObjectThrowableErrorExceptionRuntimeExceptionIOException5Throwabal類包括兩個子類:Error和Exception。Error類用于表示一些比較嚴重的錯誤,難以恢復(fù),程序員一般不用處理這些錯誤。Exception類一般代表程序設(shè)計或?qū)崿F(xiàn)方面的問題。Exception類包括兩個子類:RuntimeException和IOException例8-4。異常類的結(jié)構(gòu)6RuntimeException類所表示的異常,只要程序設(shè)計沒有問題都不會產(chǎn)生,對這些異常一般不做處理,以便問題能自然暴露出來。IOException類代表輸入輸出操作產(chǎn)生的異常。這些異常一般是由用戶環(huán)境而非程序本身問題造成的,JDK中一般強制調(diào)用者在使用時作處理。異常類的結(jié)構(gòu)7異常處理機制拋出(throw)異常:

在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會生成一個異常對象。生成的異常對象將傳遞給Java運行時系統(tǒng),這一異常的產(chǎn)生和提交過程稱為拋出(throw)異常。兩種處理異常的機制:

聲明拋出異常:

如果一個方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時,聲明拋出(throws)異常。這是一種消極的異常處理機制。8異常處理機制兩種處理異常的機制:

捕獲異常:

當(dāng)Java運行時系統(tǒng)得到一個異常對象時,它將會沿著方法的調(diào)用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型的異常的方法后,運行時系統(tǒng)把當(dāng)前異常對象交給這個方法進行處理,這一過程稱為捕獲(catch)異常。這是積極的異常處理機制。如果Java運行時系統(tǒng)找不到可以捕獲異常的方法,則運行時系統(tǒng)將終止,相應(yīng)的Java程序也將退出。9

throws異常說明總是和方法說明出現(xiàn)在一起。這樣,方法說明告訴編譯器該方法可能會產(chǎn)生哪些異常,從而要求它的調(diào)用者必須考慮處理這些異常。帶throws異常說明的方法說明形式如下:

…方法名(…)[throws異常類列表]{方法體}方法拋出的異常類是throws子句中指定的異常類或其子類。

throws拋出異常10

并不是所有可能發(fā)生的異常都要在方法的說明中指定,從Error類中派生出的異常和從RuntimeException類中派生的異常就不用在方法聲明中指定。這兩類異常屬于不檢查異常。不檢查異常則是那些無法干預(yù)的異常。Java中的另一類異常是檢查異常,檢查異常是那些在程序中應(yīng)該處理的異常,程序完全可以避免的異常(比如數(shù)組越界錯誤)。而throws異常說明必須指定有可能發(fā)生的檢查異常。throws拋出異常11

在程序中使用throw語句(注意,這里是throw而不是throws)來拋出異常,該異??梢栽谠摮绦蛑羞M行捕獲、處理,也可以在調(diào)用該方法者捕獲、處理。

throw語句的形式為:

throw異常類的實例;throw拋出異常12如何創(chuàng)建和使用異常使用異??蓮木帉戃浖吆褪褂密浖邇蓚€角度來看:編寫軟件包者需要將其難以處理的情況定義為異常類,在軟件包中碰到對應(yīng)的情況時就創(chuàng)建相應(yīng)的異常對象,并通過關(guān)鍵字throw關(guān)鍵字拋出。軟件包的使用者在使用軟件包時就可以根據(jù)一定的方法獲得該異常對象,從而知道這是一個什么樣的情況,并根據(jù)需要作處理了。13異常的捕獲try{

可能產(chǎn)生異常的代碼}catch(異常類型1變量){調(diào)用者對異常的處理}catch(異常類型2變量){調(diào)用者對異常的處理}例8-5。14多個catch的匹配catch語句的順序:

捕獲異常的順序和catch語句的順序有關(guān),異常對象產(chǎn)生后,將按照次序一個一個匹配,一旦匹配成功,其余的catch語句將不再繼續(xù)和其匹配。因此,在安排catch語句的順序時,首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。15

finally語句可以說是為異常處理事件提供的一個清理機制,一般是用來關(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)生的異常是否會被捕獲,finally中的語句最終都會被執(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將這個異常拋出給方法的調(diào)用者;(4)try塊中產(chǎn)生了異常,而此異常在方法內(nèi)沒有被捕獲。在這種情況下,Java將執(zhí)行try塊中的代碼直到產(chǎn)生異常,然后跳過try塊中的代碼而轉(zhuǎn)去執(zhí)行finally子句中的代碼,最后將異常拋出給方法的調(diào)用者。finally子句20finally中的內(nèi)容總會執(zhí)行到,甚至當(dāng)try中執(zhí)行到return語句也會先將finally執(zhí)行完再返回執(zhí)行return。finally總會執(zhí)行,除了一種情況:程序執(zhí)行到System.exit(),這時程序會立刻退出。例8-7。finally子句21方法相互調(diào)用及異常處理規(guī)則程序從main開始執(zhí)行,若其中執(zhí)行了方法go1(),而go1()又調(diào)用了方法go(),在方法go()的語句執(zhí)行時有異常拋出,則該異常將根據(jù)調(diào)用關(guān)系一層一層向外拋出,直到某個方法將其捕獲,若所有的方法都為捕獲,則程序?qū)⒎钦M顺?。程序流程圖如下圖所示。例8-8、8-9、8-10。22方法相互調(diào)用及異常處理規(guī)則23強制處理Java中可以在方法(函數(shù))定義中加入throws關(guān)鍵字聲明拋出異常來實現(xiàn)強制處理。實現(xiàn)強制處理的方法在使用時必須對其進行異常處理,否則編譯出錯。處理的辦法有兩種:1、try…catch語句處理2、在調(diào)用該方法的方法聲明中繼續(xù)聲明拋出異常。例8-12、8-13、8-14、8-15。24用戶定義的異常1、定義Exception子類,代表異常類型2、在適當(dāng)?shù)臅r候創(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

由于異常使用起來非常方便,以至于在很多情況下可能會濫用異常。但是,使用異常處理會降低程序運行的速度,如果在程序中過多地使用異常處理,程序的執(zhí)行速度會顯著地降低。這里給出幾點建議,來幫助掌握好使用異常處理的尺度。

正確地使用異常30(1)在可以使用簡單的測試就能完成的檢查中,不要使用異常來代替它。例如:

if(ins!=null)

//使用ins引用對象

{…

}(2)不要過細地使用異常。最好不要到處使用異常,更不要在循環(huán)體內(nèi)使用異常處理,可以將它包裹在循環(huán)體外面.正確地使用異常31(3)不要捕獲了一個異常而又不對它做任何的處理。如:

try{……//正常執(zhí)行的代碼

}catch(Exceptione){}(4)將異常保留給方法的調(diào)用者并非不好的做法。對于有些異常,將其交給方法的調(diào)用者去處理是一種更好的處理辦法。正確地使用異常32

異常處理把Java程序各種可能出現(xiàn)的錯誤都看作異常,集中起來統(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論