




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
跟我學(xué)Java面向?qū)ο蟪绦蛟O(shè)計技術(shù)及應(yīng)用——Java異常處理技術(shù)及應(yīng)用[本講的知識要點]Java異常編程規(guī)則、try、catch、finally語句、聲明和拋出異常,用戶自定義異常類的編程規(guī)則異常處理技術(shù)1、含義程序在運行過程中所發(fā)生的錯誤事件(如數(shù)組越界、文件操作時未找到文件、除法溢出等),而這些錯誤在設(shè)計時不能準(zhǔn)確地識別出但又可能會發(fā)生或者不會發(fā)生。2、正確理解程序設(shè)計中的三種錯誤(1)語法錯誤(編譯時的錯誤)(2)邏輯錯誤(運行時的錯誤)(3)異常錯誤(運行時的錯誤)3、異常錯誤的特點(以“人身保險”為例加以說明異常的特性)程序在運行過程中所發(fā)生的錯誤事件;程序員在編程時無法預(yù)知它是否會產(chǎn)生;產(chǎn)生與否取決于程序當(dāng)時的執(zhí)行環(huán)境。4、代碼示例importjava.io.*;classExceptionDemo{ publicstaticvoidmain(Stringargs[]){ FileInputStreamfis=newFileInputStream(“text”);//如果所打開的文件名不存在的 intb; //情況下將產(chǎn)生異常 while((b=fis.read())!=-1) { System.out.println(b); } fis.close(); }}5、異常處理的優(yōu)點能將錯誤處理代碼與“常規(guī)”代碼相分離;能將錯誤沿調(diào)用棧向上傳播;能按錯誤類型和錯誤對象分組,分門別類地加以處理(它是面向?qū)ο蠓绞降腻e誤處理方法);有利于程序的調(diào)試并且可以實現(xiàn)在程序出現(xiàn)異常時正常結(jié)束程序的流程。在用傳統(tǒng)的語言編程時,程序員只能通過函數(shù)的返回值來發(fā)出錯誤信息。這易于導(dǎo)致很多錯誤并且在很多應(yīng)用情況下,還需要知道錯誤產(chǎn)生的內(nèi)部細節(jié)。這些,是通過函數(shù)的返回值所無法達到的。(1)常規(guī)的錯誤處理的程序代碼示例intreturnCode=saveData(oneData);if(returnCode==0){//沒有產(chǎn)生出錯誤}elseif(returnCode==1){//產(chǎn)生出錯誤碼為1的錯誤}elseif(returnCode==2){//產(chǎn)生出錯誤碼為2的錯誤}(2)異常方式的錯誤處理try{oneObj.saveData(oneData);}catch(SomeOneExceptione){//產(chǎn)生出SomeOneException類型的錯誤}catch(OtherOneExceptione){//產(chǎn)生出OtherOneException類型的錯誤}6、Java的異常處理機制主要體現(xiàn)在“拋出異常”并“捕獲異?!边@兩個層次。7、拋出異常當(dāng)程序執(zhí)行過程中產(chǎn)生異常時,運行系統(tǒng)將拋出異常類對象(它代表某一異常類型的錯誤事件)。8、捕獲異常用戶程序或運行系統(tǒng)可以捕獲該異常類對象(在函數(shù)的調(diào)用棧中查找能處理此異常事件的程序為止)并相應(yīng)地給出處理的方法(代碼)。9、如何捕獲異常采用try,catch,finally語句塊(try、catch、finally語句塊及其用法如下)。10、try語句塊它指定可能會產(chǎn)生異常的語句范圍,也即為catch規(guī)定異常捕獲的語句范圍。編程格式:try{ 可能會產(chǎn)生異常的語句塊; }11、catch語句塊它指明需要捕獲異常事件的類型并相應(yīng)地給出處理的方法(代碼)。編程格式: catch(異常事件的類型對象名){ //并相應(yīng)地給出處理的方法(代碼); }12、多catch語句塊編程時所應(yīng)該注意的幾點(1)應(yīng)從特殊到一般進行匹配(先將特殊類型的異常事件放在前面,再一般類型的異常事件)。(2)try與catch之間不能有其他語句(不能被隔斷)。try{
}
intx=1;//錯誤,不能被隔斷
catch(Exceptione){
}13、finally語句塊它指定一代碼塊,不管是否有異常產(chǎn)生或是否捕獲住該異常,程序都從此處繼續(xù)向后執(zhí)行。從而達到提供統(tǒng)一的出口(如關(guān)閉文件、清除系統(tǒng)資源等)。(1)try/catch/finally實例importjava.io.*; classExceptionDemo { publicstaticvoidmain(Stringargs[]){ FileInputStreamfis=null; try//劃定程序出所可能產(chǎn)生的異常范圍 { System.out.println(“firstargumentis”+args[0]); fis=newFileInputStream(“text”);ut.println(“contentoftextis:”); intb; while((b=fis.read()!=-1)) { System.out.println((char)b); } } catch(FileNotFoundExceptione)//捕獲程序中所可能產(chǎn)生的各種異常 { System.out.println(e); } catch(IOExceptione)//注意各個catch的擺放的前后位置的要求 { System.out.println(e); } catch(IndexOutOfBoundsExceptione) { System.out.println(e); } finally //統(tǒng)一的出口 { if(fis!=null) { System.out.println(“Closingfile…”); fis.close(); } else { System.out.println(“FileInputStreamnotOpen!”); } } } }(2)try-catch實例publicclassTest{publicstaticvoidmain(String[]args){int[]myInt=newint[10];for(inti=1;i<=10;i++){//ifi<=10則進入循環(huán)體System.out.println("i="+i); try{ myInt[i]=i;//可能發(fā)生異常的位置 } catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("重新設(shè)定下標(biāo)為-1"); i=-1;//重新設(shè)定為-1 } } }}14、Java中的異常類的層次結(jié)構(gòu)Error類(不必捕獲)和Exception類(應(yīng)當(dāng)捕獲)。并且有如下子類AWTException,InterruptedException,IOException等(其它請見JDK的幫助文檔)。不必try-catch它RuntimeExceptionRuntimeException類的派生類(其它運行異常子類)Error類的派生類ErrorExceptionObjectThrowableException類的派生類(其它非運行異常子類)不必try-catch它RuntimeExceptionRuntimeException類的派生類(其它運行異常子類)Error類的派生類ErrorExceptionObjectThrowableException類的派生類(其它非運行異常子類)必須try-catch它必須try-catch它15、程序中對異常處理的方法當(dāng)編程使用某一個帶有異常定義的函數(shù)時,程序員可以有如下兩種處理異常的方法。16、通過try、catch、finally語句塊,捕獲住該異常(參見實例一)publicclassExceptionDemo{ staticvoidcompute(inta)throwsException{if(a>10) thrownewException(); System.out.println("NormalExit"); }publicstaticvoidmain(Stringargs[]){try{ intValue=1; compute(Value); Value=20;異常的捕獲 compute(Value);異常的捕獲 } catch(Exceptione){System.out.println("Caught"+e); } }}17、不捕獲和處理該異常異常的繼續(xù)聲明(繼續(xù)上傳)但必須繼續(xù)上傳(遞交給上一級的調(diào)用者來處理),這可通過throws語句來聲明所拋出的異常(參見實例二)。異常的繼續(xù)聲明(繼續(xù)上傳)importjava.io.*; //實例二classExceptionDemo{publicstaticvoidmain(Stringargs[])throwsException{intValue=1;compute(Value);異常的聲明 Value=20;異常的聲明compute(Value); }staticvoidcompute(inta)throwsException{異常的拋出if(a>10)異常的拋出thrownewException(); System.out.println("NormalExit");}}18、聲明和拋出異常(1)異常的聲明編程時應(yīng)該在可能會出現(xiàn)異常的函數(shù)聲明中給出異常的定義(或聲明)。(2)定義的格式在函數(shù)聲明的后面采用“throws定義的異常事件類型列表(類名)”來定義異常。返回類型函數(shù)名(形參定義)throws定義的異常事件類型列表(類名) {函數(shù)體定義; }(3)應(yīng)用要點當(dāng)某一個函數(shù)本身不處理某些異常時,也可在定義該函數(shù)時可預(yù)先說明(聲明)該函數(shù)不處理的異常類型。請參見上面示例中的publicstaticvoidmain(Stringargs[])throwsException的定義。19、異常的拋出(1)系統(tǒng)自動拋出的異常(程序中出現(xiàn)系統(tǒng)中定義的異常時,可以由系統(tǒng)自動來拋出它)。(2)對于在函數(shù)定義時采用throws所聲明的某個異常類型時,在其函數(shù)體中必須使用“throw異常事件(對象名)”來拋出該種類型的異常事件(程序員自己拋出程序中定義的自己的異常事件),以便上一級的調(diào)用者來捕獲并處理它。20、聲明自己的異常類的編程要求(1)從系統(tǒng)中的Exception類來派生;(2)聲明自己的異常類的成員數(shù)據(jù)或成員方法,以反映一定的錯誤信息。classMyExceptionextendsException {聲明自己的異常類但必須從Exception聲明自己的異常類但必須從Exception類派生 MyException(inta){detail=a; } publicStringtoString(){return"MyException"+detail; }}publicclassExceptionDemo{staticvoidcompute(inta)throwsMyException {if(a>10)拋出自己的異常類對象 thrownewMyException(a);拋出自己的異常類對象 System.out.println("NormalExit"); }publicstaticvoidmain(Stringargs[]){try{compute(1); compute(20); } catch(MyExceptione){System.out.println("Caugh"+e); }}}21、應(yīng)用要點聲明自己的異常類的主要目的是為應(yīng)用程序中特定錯誤提供相應(yīng)的錯誤提示信息,而不便采用標(biāo)準(zhǔn)的錯誤信息,同時也可擴充Java系統(tǒng)中的異常類以滿足用戶的特定的應(yīng)用需要。22、文件拷貝的應(yīng)用程序(在本例中聲明有用戶自定義的異常類) importjava.io.*;//輸入輸出(文件)流類 publicclassFileCopy { publicstaticvoidmain(String[]args){/*命令行參數(shù)字符串?dāng)?shù)組(注意Java與C++的不同),獲得命令行參數(shù)的個數(shù)是否是二個(源文件名、目標(biāo)文件名)*/ if(args.length!=2)//顯示程序的用法 System.out.println("Usage:javaFileCopy"+"<SourceFile><DestFile>"); else { try{ copy(args[0],args[1]);//執(zhí)行文件拷貝 }//捕獲文件拷貝過程中可能出現(xiàn)的自定義的各種異常 catch(FileCopyExceptione){ System.out.println(e.getMessage());//顯示異常信息 }//捕獲文件拷貝過程中可能出現(xiàn)的一般的異常 catch(IOExceptione) { System.out.println(e.getMessage());//顯示異常信息 }聲明所拋出異常 }聲明所拋出異常 } publicstaticvoidcopy(Stringsrcfile,Stringdstfile)throwsFileCopyException{ byte[]buf; intbytes; Filesrc=newFile(srcfile);//根據(jù)源文件名生成源文件對象 Filedst=newFile(dstfile);//根據(jù)目標(biāo)文件名生成目標(biāo)文件對象定義輸入輸出流對象 FileInputStreamsrcs=null;定義輸入輸出流對象 FileOutputStreamdsts=null; if(!src.exists()||!src.isFile()) thrownewFileCopyException("FileCopy"+"nosuchsourceFile:"+srcfile); if(!src.canRead()) thrownewFileCopyException("FileCopy:"+"sourcefileisunreadable:"+srcfile);識別源、目文件是否有異常并拋出相應(yīng)的異常 if(dst.exists()){ 識別源、目文件是否有異常并拋出相應(yīng)的異常if(dst.isFile()){ if(!dst.canWrite()) thrownewFileCopyException("FileCopy:"+"destfileisunWriteable:"+dstfile); System.out.print("File"+dstfile+"alreadyexists,OverWrite?(Y/N):"); System.out.flush(); Stringresp=newDataInputStream(System.in).readLine(); if(!resp.equals("Y")&&!resp.equals("y")) thrownewFileCopyException("FileCopy:"+"copycancelled."); } else { thrownewFileCopyException("FileCopy:"+"destisnotafile:"+dstfile); } } try{ srcs=newFil
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新生命如何誕生從受孕到分娩全過程詳解(課件)
- 骨盆骨折護理常規(guī)
- 食物過敏的護理
- 囊狀淋巴管瘤的臨床護理
- 人力資源試用期轉(zhuǎn)正工作總結(jié)模版
- 大學(xué)生職業(yè)規(guī)劃大賽《市場營銷專業(yè)》生涯發(fā)展展示
- 子宮肌病護理
- 婦科產(chǎn)科護理流程
- 原發(fā)性心臟淋巴瘤的臨床護理
- 兒科安全用藥及護理
- 多發(fā)性骨髓瘤臨床路徑
- 施工現(xiàn)場建筑垃圾處置專項方案
- 歡迎新同學(xué)幼兒園中小學(xué)開學(xué)第一課入學(xué)準(zhǔn)備ppt
- (整理)柴油發(fā)電機的檢修
- 2021年肇慶市端州區(qū)華佗醫(yī)院醫(yī)護人員招聘筆試試題及答案解析
- JJG 694-2009 原子吸收分光光度計-(高清現(xiàn)行)
- DB23∕T 482-1998 主要樹種樹高級立木材積表
- Q∕GDW 12130-2021 敏感用戶接入電網(wǎng)電能質(zhì)量技術(shù)規(guī)范
- 車間作業(yè)安全培訓(xùn)資料培訓(xùn)資料
- 教練技術(shù)一階段講義(共59頁)
- 超聲肺功能探測新技術(shù)
評論
0/150
提交評論