




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章Java語(yǔ)言中的異常異常Java把程序運(yùn)算中可能遇到的錯(cuò)誤分為兩類:一類是非致命性的,通過(guò)某種修正后程序還能繼續(xù)執(zhí)行。這類錯(cuò)誤稱作異常。另一類是致命性的,即程序遇到了非常嚴(yán)重的不正常狀態(tài),不能簡(jiǎn)單地恢復(fù)執(zhí)行,這就是錯(cuò)誤。Java提供了異常處理機(jī)制,在Exception類中定義了程序產(chǎn)生異常的條件。對(duì)待異常通常并不是簡(jiǎn)單地結(jié)束程序,而是轉(zhuǎn)去執(zhí)行某段特殊代碼處理這個(gè)異常,設(shè)法恢復(fù)程序繼續(xù)執(zhí)行。Java實(shí)現(xiàn)了C++風(fēng)格的異常。當(dāng)程序中發(fā)生異常時(shí),稱程序產(chǎn)生了一個(gè)異常事件,相應(yīng)地生成異常對(duì)象。生成的異常對(duì)象傳遞給Java運(yùn)行時(shí)系統(tǒng)。異常產(chǎn)生和提交的這一過(guò)程稱為拋出。異常發(fā)生時(shí),Java運(yùn)行時(shí)系統(tǒng)從生成對(duì)象的代碼塊開始,沿方法的調(diào)用棧逐層回溯,尋找相應(yīng)的處理代碼,并把異常對(duì)象交給該方法處理,這一過(guò)程稱為捕獲。所有的包中都定義了異常類和錯(cuò)誤類。Exception類是所有異常的父類Error類是所有錯(cuò)誤的父類,這兩個(gè)類同時(shí)又是Throwable的子類。異常和錯(cuò)誤類的層次結(jié)構(gòu)如圖所示:Java.lang.ThrowableJava.lang.ObjectJava.lang.errorJava.lang.exceptionErrors…Exceptions…異常示例publicclass
HelloWorld
{ publicstaticvoidmain(Stringargs[]){ inti=0; Stringgreetings[]={"Helloworld!", "No,Imeanit!","HELLOWORLD!!" }; while(i<4){ System.out.println(greetings[i]); i++; } }}程序輸出如下所示:
javaHelloWorld
HelloWorld!No,Imeanit!HELLOWORLD!!java.lang.ArrayIndexOutOfBoundsExcepiton:3atHelloWorlds.main(HelloWorld.java:12)異常處理對(duì)所發(fā)生的異常進(jìn)行的處理就是異常處理。異常處理的重要性在于,程序不但能發(fā)現(xiàn)異常,還要捕獲異常。try,catch和finally語(yǔ)句使用try語(yǔ)句括住可能拋出異常的代碼段,用catch語(yǔ)句指明要捕獲的異常及相應(yīng)的處理代碼。try與catch語(yǔ)句的語(yǔ)法格式如下:
try{ //此處為拋出具體異常的代碼
}catch(ExceptionType1e){ //拋出ExceptionType1異常時(shí)要執(zhí)行的代碼}catch(ExceptionType2e){ //拋出ExceptionType2異常時(shí)要執(zhí)行的代碼...}catch(ExceptionTypeke){ //拋出ExceptionTypek異常時(shí)要執(zhí)行的代碼}finally{
//必須執(zhí)行的代碼}其中,ExceptionType1,ExceptionType2,...,ExceptionTypek是產(chǎn)生的異常類型。根據(jù)發(fā)生異常所屬的類,找到對(duì)應(yīng)的catch語(yǔ)句,然后執(zhí)行其后的語(yǔ)句序列。不論是否捕獲到異常,總要執(zhí)行finally后面的語(yǔ)句。例6-1try{ startFaucet(); waterlawn();}finally{ stopFaucet();}再討論前面的示例publicclassHelloWorld{publicstaticvoidmain(Stringargs[]){
inti=0; Stringgreetings[]={"Helloworld!", "No,Imenait!",
"HELLOWORLD!!“ };while(i<4){ try{ System.out.println(greetings[i]); }
catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("Re\|settingIndexValue"); i=-1; }catch(Exceptione){ System.out.println(e.toString()); }finally{ System.out.println("Thisisalwaysprinted");i++; }//while循環(huán)結(jié)束 }//主函數(shù)main結(jié)束}循環(huán)執(zhí)行時(shí),屏幕上顯示的信息如下:Helloworld!ThisisalwaysprintedNo,Imeanit!ThisisalwaysprintedHELLOWORLD!!ThisisalwaysprintedResettingindexValueThisisalwaysprinted公共異常Java預(yù)定義了一些常見異常,最常用到的有如下幾個(gè)。(1)ArithmeticException
整數(shù)除法中,如果除數(shù)為0,則發(fā)生該類異常如:
inti=12/0;(2)
NullPointerException
如果一個(gè)對(duì)象還沒(méi)有實(shí)例化,那么訪問(wèn)該對(duì)象或調(diào)用它的方法將導(dǎo)致NullPointerException異常如:
imageim[]=newimage[4]; System.out.println(im[0].toString())(3)
NegativeArraySizeException
數(shù)組的元素個(gè)數(shù)應(yīng)是一個(gè)大于等于0的整數(shù)。創(chuàng)建數(shù)組時(shí),如果元素個(gè)數(shù)是個(gè)負(fù)數(shù),則會(huì)引發(fā)NegativeArraySizeException異常。(4)
ArrayIndexOutOfBoundsExceptionJava
把數(shù)組看作是對(duì)象,并用length變量記錄數(shù)組的大小。訪問(wèn)數(shù)組元素時(shí),運(yùn)行時(shí)環(huán)境根據(jù)length值檢查下標(biāo)的大小。如果數(shù)組下標(biāo)越界,則將導(dǎo)致ArrayIndexOutOfBoundsException異常。(5)
SecurityException
該類異常一般在瀏覽器內(nèi)拋出。若Applet試圖進(jìn)行下述操作,則由SecurityManager類拋出此異常:訪問(wèn)本地文件。打開一個(gè)套接口,而不是返回到提供Applet的主機(jī)。在運(yùn)行時(shí)環(huán)境中運(yùn)行另一個(gè)程序。
除此之外,常見異常還有:
ArrayStoreException:程序試圖存取數(shù)組中錯(cuò)誤的數(shù)據(jù)類型。
FileNotFoundException:試圖存取一個(gè)并不存在的文件。
IOException:通常的I/O錯(cuò)誤。異常分類在Java中主要有三類異常。Java定義了類java.lang.Throwable,它是使用異常處理機(jī)制可被拋出并捕獲的所有異常對(duì)象的父類。它有三個(gè)基本子類異常分類ExceptionErrorRuntimeExceptionThrowable異常子類使用的目的:(1)Error表示很難恢復(fù)的錯(cuò)誤,如內(nèi)存越界。一般不期望用戶程序來(lái)處理,即使程序員有能力處理這種錯(cuò)誤,也還是交給系統(tǒng)處理為好。(2)
RuntimeException用來(lái)表示設(shè)計(jì)或?qū)崿F(xiàn)方面的問(wèn)題,如數(shù)組越界等。因?yàn)樵O(shè)計(jì)和實(shí)現(xiàn)正確的程序不會(huì)引發(fā)這類異常,所以常常不處理它。(3)
其他異常表示運(yùn)行時(shí)因環(huán)境的影響可能發(fā)生并可被處理的問(wèn)題。如文件沒(méi)找到或不完整的URL等。因?yàn)橛脩舻腻e(cuò)誤很可能導(dǎo)致這類問(wèn)題發(fā)生,比如用戶鍵入的內(nèi)容不正確,所以Java鼓勵(lì)程序員處理它們。拋出Java要求,如果一個(gè)方法確實(shí)引發(fā)了一個(gè)異常,那么在方法中必須寫明相應(yīng)的處理代碼。程序員處理異常有兩種方法:一種是使用try{}catch(){}塊,捕獲到所發(fā)生的異常類,并進(jìn)行相應(yīng)的處理。另一種方法是,程序員不在當(dāng)前方法內(nèi)處理異常,而是把異常拋出到調(diào)用方法中。方法:<訪問(wèn)權(quán)限修飾符><返回值類型><方法名>(參數(shù)列表)throws
異常列表關(guān)鍵字throws后是該方法內(nèi)可能發(fā)生且不進(jìn)行處理的所有異常列表,各異常之間以逗號(hào)分隔。如:
publicvoidtroubleSome()throwsIOException一般地,如果一個(gè)方法引發(fā)了一個(gè)異常,而它自己又不處理,就要由其調(diào)用者方法進(jìn)行處理。創(chuàng)建自己的異常除了使用系統(tǒng)預(yù)定義的異常外,用戶還可以創(chuàng)建自己的異常。如:publicclassMyExceptionextendsException{...}用戶自定義的所有異常類都必須是Exception的子類。在程序中發(fā)現(xiàn)異常情況時(shí),程序員可以拋出(throw)一個(gè)異常實(shí)例,如:thrownewMyException();定義自己的異常classMyExceptionextendsException{ privateintdetail;
MyExceptin(inta){ pubilcString
toString(){return"MyException["+detail+"]";}}class
ExceptionDemo{ staticvoidcompute(inta)
throwsMyExceptin{System.out.println("Calledcompute("+ a+".");if(a>10)thrownewMyException(a);System.out.println("Normalexit");}
publicstaticvoidmain(Stringargs[]){ try{ compute(1); compute(20); } catch(MyExceptione){
System.out.println(
"Exceptioncaught"+e); }}}示例publicvoid
connectMe(Stringservename)throwsServerTimedOutException{
intsucess;
intportToConnect=80;success=open(serveName,portToConnect);
portToConnect);if(success==-1){thrownewServerTimedOutException();}}使用try語(yǔ)句可捕獲該異常:publicvoid
findServer(){...try{
connectMe(defaultServe
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水泥路面施工承包合同
- 辦公樓裝修合同合同
- 委托招聘合同協(xié)議
- 招標(biāo)信息合作協(xié)議書
- 出版業(yè)數(shù)字化出版與版權(quán)保護(hù)管理方案
- 建筑原材料采購(gòu)合同
- 樓房租賃合同
- 傳統(tǒng)行業(yè)數(shù)字化轉(zhuǎn)型路徑選擇及實(shí)施方案研究項(xiàng)目
- 電子行業(yè)電子設(shè)備保修協(xié)議
- 項(xiàng)目進(jìn)展困難原因分析與解決方案說(shuō)明報(bào)告
- 初中物理實(shí)驗(yàn)教學(xué)
- 雨水管道中粗砂回填
- 團(tuán)意操作流程詳解課件
- SH/T 0356-1996燃料油
- 第1課中華優(yōu)秀傳統(tǒng)文化的內(nèi)涵與特點(diǎn)課件(共28張PPT)
- 耳鼻咽喉頭頸外科學(xué)-鼻科癥狀學(xué)課件
- 輪胎使用日常說(shuō)明
- 第8章 動(dòng)車組空調(diào)裝置檢修動(dòng)車組維護(hù)與檢修
- 《幼小銜接存在的問(wèn)題及對(duì)策研究(論文)6400字》
- 英語(yǔ)詞匯量測(cè)試附答案
- 七年級(jí)上冊(cè)整式的化簡(jiǎn)求值專題訓(xùn)練26914
評(píng)論
0/150
提交評(píng)論