




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五講異常什么是異常異常的處理使用預定義的異常處理的規(guī)則1什么是異常
異常(Exception)是程序執(zhí)行過程中出現(xiàn)的非正常事件,即各種意外情況。比如說:①用戶輸入出錯②所需文件找不到③運行時磁盤空間不夠④內存不夠⑤算術運算錯(數(shù)的溢出,被零除…)⑥數(shù)組下標越界……2什么是異常當Java程序出現(xiàn)以上的錯誤時,就會在所處的方法中產生一個異常對象。這個異常對象包括錯誤的類型,錯誤出現(xiàn)時程序的運行狀態(tài)以及對該錯誤的詳細描述。3為什么需要異常作為面向對象的編程語言,Java程序在運行過程中遇到的各種異常情況也是通過對象表示的。在軟件中通過一類特殊的對象——異常將這些特殊情況傳遞給使用該軟件包的程序,由其決定如何處理。4異常類的結構ObjectThrowableErrorExceptionRuntimeExceptionIOException5Throwabal類包括兩個子類:Error和Exception。Error類用于表示一些比較嚴重的錯誤,難以恢復,程序員一般不用處理這些錯誤。Exception類一般代表程序設計或實現(xiàn)方面的問題。Exception類包括兩個子類:RuntimeException和IOException例8-4。異常類的結構6RuntimeException類所表示的異常,只要程序設計沒有問題都不會產生,對這些異常一般不做處理,以便問題能自然暴露出來。IOException類代表輸入輸出操作產生的異常。這些異常一般是由用戶環(huán)境而非程序本身問題造成的,JDK中一般強制調用者在使用時作處理。異常類的結構7異常處理機制拋出(throw)異常:
在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會生成一個異常對象。生成的異常對象將傳遞給Java運行時系統(tǒng),這一異常的產生和提交過程稱為拋出(throw)異常。兩種處理異常的機制:
聲明拋出異常:
如果一個方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時,聲明拋出(throws)異常。這是一種消極的異常處理機制。8異常處理機制兩種處理異常的機制:
捕獲異常:
當Java運行時系統(tǒng)得到一個異常對象時,它將會沿著方法的調用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型的異常的方法后,運行時系統(tǒng)把當前異常對象交給這個方法進行處理,這一過程稱為捕獲(catch)異常。這是積極的異常處理機制。如果Java運行時系統(tǒng)找不到可以捕獲異常的方法,則運行時系統(tǒng)將終止,相應的Java程序也將退出。9
throws異常說明總是和方法說明出現(xiàn)在一起。這樣,方法說明告訴編譯器該方法可能會產生哪些異常,從而要求它的調用者必須考慮處理這些異常。帶throws異常說明的方法說明形式如下:
…方法名(…)[throws異常類列表]{方法體}方法拋出的異常類是throws子句中指定的異常類或其子類。
throws拋出異常10
并不是所有可能發(fā)生的異常都要在方法的說明中指定,從Error類中派生出的異常和從RuntimeException類中派生的異常就不用在方法聲明中指定。這兩類異常屬于不檢查異常。不檢查異常則是那些無法干預的異常。Java中的另一類異常是檢查異常,檢查異常是那些在程序中應該處理的異常,程序完全可以避免的異常(比如數(shù)組越界錯誤)。而throws異常說明必須指定有可能發(fā)生的檢查異常。throws拋出異常11
在程序中使用throw語句(注意,這里是throw而不是throws)來拋出異常,該異常可以在該程序中進行捕獲、處理,也可以在調用該方法者捕獲、處理。
throw語句的形式為:
throw異常類的實例;throw拋出異常12如何創(chuàng)建和使用異常使用異常可從編寫軟件包者和使用軟件包者兩個角度來看:編寫軟件包者需要將其難以處理的情況定義為異常類,在軟件包中碰到對應的情況時就創(chuàng)建相應的異常對象,并通過關鍵字throw關鍵字拋出。軟件包的使用者在使用軟件包時就可以根據(jù)一定的方法獲得該異常對象,從而知道這是一個什么樣的情況,并根據(jù)需要作處理了。13異常的捕獲try{
可能產生異常的代碼}catch(異常類型1變量){調用者對異常的處理}catch(異常類型2變量){調用者對異常的處理}例8-5。14多個catch的匹配catch語句的順序:
捕獲異常的順序和catch語句的順序有關,異常對象產生后,將按照次序一個一個匹配,一旦匹配成功,其余的catch語句將不再繼續(xù)和其匹配。因此,在安排catch語句的順序時,首先應該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。15
finally語句可以說是為異常處理事件提供的一個清理機制,一般是用來關閉文件或釋放其他的系統(tǒng)資源,作為try-catch-finally結構的一部分,可以沒有finally語句,如果存在finally語句,不論try塊中是否發(fā)生了異常是否執(zhí)行過catch語句,都要執(zhí)行finally語句。finally子句16帶有finally子句的try-catch-finally語句的形式如下:
try
{…}//是正常執(zhí)行的代碼,可能產生異常
catch(異常類1e1)
{…}//異常類1的處理代碼
catch(異常類2e2)
{…}
//異常類2的處理代碼
……
catch(異常類nen)
{…}//異常類n的處理代碼
finally
{…}
//…是執(zhí)行清除工作的語句finally子句17
帶有finally子句的try-catch-finally語句無論在try塊中是否產生異常,也不管產生的異常是否會被捕獲,finally中的語句最終都會被執(zhí)行。具體的執(zhí)行過程如下:
(1)try塊中的語句沒有產生異常。在這種情況下,Java首先執(zhí)行try塊中的所有的語句,然后執(zhí)行finally子句中的代碼,最后執(zhí)行try…catch..finally塊后面的語句;
finally子句18
(2)try塊中的語句產生了異常,而且此異常在方法內被捕獲。在這種情況下,Java首先執(zhí)行try塊中的語句,直到產生異常處,然后跳過此try塊中剩下的語句,執(zhí)行捕獲此異常的catch子句的處理代碼;然后執(zhí)行finally子句中的代碼;
finally子句19
(3)如果catch子句中沒有重新拋出異常,那么Java將執(zhí)行try…catch…finally塊后面的語句。如果在catch子句又重新拋出了異常,那么Java將這個異常拋出給方法的調用者;(4)try塊中產生了異常,而此異常在方法內沒有被捕獲。在這種情況下,Java將執(zhí)行try塊中的代碼直到產生異常,然后跳過try塊中的代碼而轉去執(zhí)行finally子句中的代碼,最后將異常拋出給方法的調用者。finally子句20finally中的內容總會執(zhí)行到,甚至當try中執(zhí)行到return語句也會先將finally執(zhí)行完再返回執(zhí)行return。finally總會執(zhí)行,除了一種情況:程序執(zhí)行到System.exit(),這時程序會立刻退出。例8-7。finally子句21方法相互調用及異常處理規(guī)則程序從main開始執(zhí)行,若其中執(zhí)行了方法go1(),而go1()又調用了方法go(),在方法go()的語句執(zhí)行時有異常拋出,則該異常將根據(jù)調用關系一層一層向外拋出,直到某個方法將其捕獲,若所有的方法都為捕獲,則程序將非正常退出。程序流程圖如下圖所示。例8-8、8-9、8-10。22方法相互調用及異常處理規(guī)則23強制處理Java中可以在方法(函數(shù))定義中加入throws關鍵字聲明拋出異常來實現(xiàn)強制處理。實現(xiàn)強制處理的方法在使用時必須對其進行異常處理,否則編譯出錯。處理的辦法有兩種:1、try…catch語句處理2、在調用該方法的方法聲明中繼續(xù)聲明拋出異常。例8-12、8-13、8-14、8-15。24用戶定義的異常1、定義Exception子類,代表異常類型2、在適當?shù)臅r候創(chuàng)建并拋出異常對象。3、調用者處理異常例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)體內使用異常處理,可以將它包裹在循環(huán)體外面.正確地使用異常31(3)不要捕獲了一個異常而又不對它做任何的處理。如:
try{……//正常執(zhí)行的代碼
}catch(Exceptione){}(4)將異常保留給方法的調用者并非不好的做法。對于有些異常,將其交給方法的調用者去處理是一種更好的處理辦法。正確地使用異常32
異常處理把Java程序各種可能出現(xiàn)的錯誤都看作異常,集中起來統(tǒng)一處理。程序員只需要說明何處理可能的出現(xiàn)異常,如何處理即可。
throws拋出異常和方法說明聯(lián)系在一起
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 IEC 60684-3-281:2025 EN-FR Flexible insulating sleeving - Part 3: Specifications for individual types of sleeving - Sheet 281: Heat-shrinkable,polyolefin sleeving,semicond
- 【正版授權】 ISO 19642-3:2019 EN Road vehicles - Automotive cables - Part 3: Dimensions and requirements for 30 V a.c. or 60 V d.c. single core copper conductor cables
- 2025至2030中國疫苗恒溫運輸箱行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國生物濾池系統(tǒng)行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國環(huán)辛烷行業(yè)市場發(fā)展現(xiàn)狀及競爭策略與投資發(fā)展報告
- 公司新員工培訓全攻略
- 客運駕駛員汛期安全培訓
- 教育領域信息安全技術的創(chuàng)新與應用
- 醫(yī)療廣告培訓課件
- 教育領域中VR技術的創(chuàng)新應用案例
- 2024年湖北高中學業(yè)水平合格性考試物理試卷真題(含答案詳解)
- 橋梁安全區(qū)管理制度范文
- 基因調控與近視發(fā)生機制
- 第9章屋面及防水工程
- 2021MAM-6070M空壓機微電腦控制器
- 2024年全國高考新課標卷物理真題(含答案)
- 毛澤東思想和中國特色社會主義理論體系概論復習提綱
- DL-T5218-2012220kV-750kV變電站設計技術規(guī)程
- W -S-T 431-2023 護理分級標準(正式版)
- JBT 7043-2006 液壓軸向柱塞泵
- 【文創(chuàng)產品的價格決策及成本管理的案例探析16000字(論文)】
評論
0/150
提交評論