版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JAVA程序設(shè)計(jì)程序設(shè)計(jì)人民郵電出版社人民郵電出版社第第7章章 JAVA言語(yǔ)中的異常言語(yǔ)中的異常異常異常 編寫程序時(shí)多多少少總會(huì)有些錯(cuò)誤,程序中的語(yǔ)法錯(cuò)誤解在編譯時(shí)被發(fā)現(xiàn)并修正,而有些錯(cuò)誤是發(fā)生在運(yùn)轉(zhuǎn)階段的。這些錯(cuò)誤按照其嚴(yán)重程度分為兩類,一類是致命性的嚴(yán)重錯(cuò)誤,它們的出現(xiàn)能夠會(huì)導(dǎo)致系統(tǒng)解體,并且程序員并不能編寫程序處理所出現(xiàn)的問(wèn)題。另一類是普通級(jí)別的錯(cuò)誤,這類錯(cuò)誤假設(shè)不加控制就使程序非正常中斷,但假設(shè)編寫代碼來(lái)處置的話,就有能夠防止中斷程序的執(zhí)行。這類錯(cuò)誤普通地稱為異常Exception,用來(lái)處置異常的過(guò)程稱為異常處置。異常異常在Java中主要有三類異常?,F(xiàn)實(shí)上,Java定義了類java.l
2、ang.Throwable,它是運(yùn)用異常處置機(jī)制可被拋出并捕獲的一切異常對(duì)象的父類。它有三個(gè)根本子類,如以下圖: 異常異常每個(gè)類的運(yùn)用目的不同。Error表示很難恢復(fù)的錯(cuò)誤。普通不期望用戶程序來(lái)處置,即使程序員有才干處置這種錯(cuò)誤,也還是交給系統(tǒng)處置為好。RuntimeException用來(lái)表示設(shè)計(jì)或?qū)崿F(xiàn)方面的問(wèn)題。由于設(shè)計(jì)和實(shí)現(xiàn)正確的程序不會(huì)引發(fā)這類異常,所以經(jīng)常不處置它。發(fā)生這類異常時(shí),運(yùn)轉(zhuǎn)時(shí)環(huán)境會(huì)輸出一條信息,提示用戶修正錯(cuò)誤。其他異常表示運(yùn)轉(zhuǎn)時(shí)因環(huán)境的影響能夠發(fā)生并可被處置的問(wèn)題。由于用戶的錯(cuò)誤很能夠?qū)е逻@類問(wèn)題發(fā)生,我們要學(xué)習(xí)的是如何處置這類異常。異常例如異常例如 例7-1 文件操作功
3、能描畫 openTheFile;/翻開文件 determine its size;/獲取文件的長(zhǎng)度 allocate that much memory;/分配內(nèi)存 read-file;/讀文件 closeTheFile;/封鎖文件 實(shí)現(xiàn)文件讀取的程序大多有上述這樣的程序框架。由于文件存放在外存,程序要訪問(wèn)文件時(shí)必需先要將文件放入內(nèi)存然后才干訪問(wèn)。這段程序是順序執(zhí)行構(gòu)造,而前一句執(zhí)行的結(jié)果又直接影響后一句能否能執(zhí)行。假設(shè)中間哪一條語(yǔ)句執(zhí)行不正確,后續(xù)語(yǔ)句都不能正確執(zhí)行,程序也會(huì)中斷。所以凡是有輸入輸出操作的語(yǔ)句都能夠會(huì)出現(xiàn)問(wèn)題。異常例如異常例如例7-2 添加了約束的文件操作功能描畫openFil
4、es; /翻開文件 if (theFilesOpen)/斷定翻開能否正確 determine the length of the file; /獲取文件的長(zhǎng)度 if (gotTheFileLength)/斷定已得到文件長(zhǎng)度 allocate that much memory; /分配內(nèi)存 if (gotEnoughMemory) /內(nèi)存分配勝利 read the file into memory; /讀文件 if (readFailed) errorCode=-1;/讀取失敗 else errorCode = -2;/讀取勝利 closeTheFile;/封鎖文件 else errorCode
5、=-3;/內(nèi)存分配不勝利 else errorCode=-4 ;/沒(méi)有得到文件長(zhǎng)度 else errorCode=-5;/文件翻開不正確異常異常 程序發(fā)生異常時(shí)稱為產(chǎn)生了一個(gè)異常事件,系統(tǒng)根據(jù)異常生成一個(gè)異常對(duì)象。根據(jù)這個(gè)異常的種類,該對(duì)象能夠由正在運(yùn)轉(zhuǎn)的方法生成,也能夠由JVM生成。異常對(duì)象中包含了該異常必要的詳細(xì)闡明信息,包括所發(fā)生的異常事件的類型及異常發(fā)生時(shí)程序的運(yùn)轉(zhuǎn)形狀。生成的異常對(duì)象傳送給Java運(yùn)轉(zhuǎn)時(shí)系統(tǒng),運(yùn)轉(zhuǎn)時(shí)系統(tǒng)尋覓相應(yīng)的代碼來(lái)處置這一異常。我們把生成異常對(duì)象并把它提交給運(yùn)轉(zhuǎn)時(shí)系統(tǒng)的這一過(guò)程稱為拋出throw一個(gè)異常。異常異常異常發(fā)生后,Java運(yùn)轉(zhuǎn)時(shí)系統(tǒng)從生成對(duì)象的代碼塊開場(chǎng)
6、進(jìn)展回溯,沿方法的調(diào)用棧逐層回溯尋覓處置代碼,并把異常對(duì)象交給該方法處置,這一過(guò)程稱為捕獲catch。如下圖: 異常處置方式例如異常處置方式例如下面用異常處置方式重寫例7-2。 try openTheFile;/翻開文件 determine its size;/獲取文件的長(zhǎng)度 allocate that much memory;/分配內(nèi)存 read-File;/讀文件 closeTheFile;/封鎖文件 catch(fileopenFailed) /文件翻開失敗的處置代碼; catch(sizeDetermineFailed) /不能獲得文件大小的處置代碼; catch(memoryAllo
7、cateFailed) /內(nèi)存分配失敗的處置代碼; catch(readFailed) /讀文件失敗的處置代碼; catch(fileCloseFailed) /封鎖文件失敗的處置代碼; finally /需求一致處置的代碼; 異常類和錯(cuò)誤類異常類和錯(cuò)誤類Java言語(yǔ)在一切的預(yù)設(shè)包中都定義了異常類Exception和錯(cuò)誤類Error。Exception類是一切異常的父類,Error類是一切錯(cuò)誤的父類,這兩個(gè)類同時(shí)又是Throwable的子類。它們的層次構(gòu)造如下圖: 異常處置相關(guān)語(yǔ)句異常處置相關(guān)語(yǔ)句 雖然引發(fā)某個(gè)詳細(xì)異常的語(yǔ)句能夠是一條,但相關(guān)的語(yǔ)句能夠會(huì)有多條,程序中運(yùn)用try語(yǔ)句將這些語(yǔ)句全
8、部括住。 在try語(yǔ)句后面是一組catch語(yǔ)句,對(duì)所括住的語(yǔ)句能夠引發(fā)的異常進(jìn)展分類,對(duì)每一種類型的異常提供一段相應(yīng)的處置代碼,每種異常對(duì)應(yīng)一個(gè)catch語(yǔ)句。try與與catch語(yǔ)句語(yǔ)句 try與catch語(yǔ)句的語(yǔ)法格式如下: try / 此處為拋出詳細(xì)異常的代碼 catch (ExceptionType1 e) / 拋出ExceptionType1異常時(shí)要執(zhí)行的代碼 catch (ExceptionType2 e) / 拋出ExceptionType2異常時(shí)要執(zhí)行的代碼 . catch (ExceptionTypek e) / 拋出ExceptionTypek異常時(shí)要執(zhí)行的代碼 final
9、ly / 必需執(zhí)行的代碼 其中,ExceptionType1,ExceptionType2,ExceptionTypek是產(chǎn)生的異常類型。根據(jù)發(fā)生異常所屬的類,找到對(duì)應(yīng)的catch語(yǔ)句,然后執(zhí)行后面的語(yǔ)句序列。Finally語(yǔ)句語(yǔ)句異常處置中有一個(gè)特殊的語(yǔ)句,即finally語(yǔ)句。它是最后一條語(yǔ)句,Java規(guī)定,不論能否捕獲到異常,總要執(zhí)行finally后面的語(yǔ)句。即使try塊中包含return、break、continue、throw等語(yǔ)句,finally語(yǔ)句也會(huì)被執(zhí)行。finally語(yǔ)句不執(zhí)行的情況只需一種,即在維護(hù)代碼內(nèi)執(zhí)行了System.exit()方法后,將不再執(zhí)行finally后面
10、的語(yǔ)句,這是不執(zhí)行finally后面語(yǔ)句的獨(dú)一一種能夠。 公共處置例如公共處置例如例7-4 公共處置例如 try openfile ();/翻開文件 read_file();/讀文件 finally closefile();/封鎖文件 由于closefile ()方法放到了finally塊中,所以總被執(zhí)行。公共處置例如公共處置例如再看下面的例子。程序7-3總會(huì)輸出“finally,而“aftertry僅在aVar的值不等于10時(shí)才被輸出。程序7-3 公共處置的完好代碼 public class tryAgain public static void main (String args) int
11、 aVar = 0; try if(aVar = 10) return; finally System.out.println(finally); System.out.println(aftertry); 公共異常公共異常 (1) ArithmeticException異常。進(jìn)展表達(dá)式計(jì)算時(shí),除數(shù)不能為零。當(dāng)程序中出現(xiàn)除數(shù)為零,或在整數(shù)運(yùn)算中對(duì)零取模時(shí),就會(huì)發(fā)生該類異常。如下面表達(dá)式將引發(fā)ArithmeticException異常: int i = 12 / 0;/除數(shù)為0 float avar = 12 % 0; /對(duì)0取模公共異常公共異常 (2) ArrayIndexOutOfBound
12、sException異常。這是數(shù)組下標(biāo)越界異常。數(shù)組元素的個(gè)數(shù)在數(shù)組初始化時(shí)曾經(jīng)確定下來(lái),程序中訪問(wèn)數(shù)組元素時(shí),不能超越數(shù)組的長(zhǎng)度。系統(tǒng)根據(jù)length值來(lái)檢查數(shù)組下標(biāo)表達(dá)式,假設(shè)超出這個(gè)值,那么將導(dǎo)致該異常。見下例。例7-5 數(shù)組下標(biāo)越界 class ArrayOut public static void main(String args) int aArray = new int3; aArray3 = 0;/數(shù)組下標(biāo)只能是0、1、2 公共異常公共異常(3) IncompatibleClassChangeException異常。這是類不兼容異常。當(dāng)修正一個(gè)類的定義后,援用該類的其它類沒(méi)有重
13、新編譯,就會(huì)產(chǎn)生該異常。對(duì)應(yīng)的情況有以下兩類: 一個(gè)類中的變量聲明由靜態(tài)變成非靜態(tài),或由非靜態(tài)變成靜態(tài),而其它訪問(wèn)該類這一變量的類沒(méi)有被重新編譯。 類中聲明的某個(gè)域或是某個(gè)方法被刪除,而其它訪問(wèn)該域或該方法的類沒(méi)有被重新編譯。(4) IncompatibleTypeException異常。這是類型不兼容異常。名字雖然與前一個(gè)異常很類似,但含義不一樣。假設(shè)試圖定義一個(gè)接口的實(shí)例,那么會(huì)引發(fā)IncompatibleTypeException異常。公共異常公共異常(5) NegativeArraySizeException異常。這是數(shù)組元素個(gè)數(shù)為負(fù)異常。數(shù)組長(zhǎng)度應(yīng)該是一個(gè)大于等于0的整數(shù),所以定義數(shù)
14、組時(shí),方括號(hào)中的數(shù)不能寫負(fù)數(shù)。當(dāng)然,假設(shè)定義一個(gè)元素個(gè)數(shù)為零的數(shù)組是沒(méi)有運(yùn)用價(jià)值的,所以也應(yīng)該防止。創(chuàng)建數(shù)組時(shí),假設(shè)指定的元素個(gè)數(shù)是個(gè)負(fù)數(shù),那么會(huì)引發(fā)該異常。例7-6 引發(fā)數(shù)組元素個(gè)數(shù)為負(fù)異常例如 class NegArray public static void main(String args) int aVar = new int-1;/數(shù)組元素個(gè)數(shù)不能是負(fù)數(shù) aVar0 = 0; 公共異常公共異常(6) NoClassDefFoundException異常。這是類未定義異常。假設(shè)一個(gè)類被援用,但在運(yùn)轉(zhuǎn)時(shí),系統(tǒng)沒(méi)有找到被援用的類,就會(huì)引發(fā)該異常。 例如,聲明一個(gè)NoClass類,其中用到
15、了另一個(gè)類anotherClass,但系統(tǒng)找不到這個(gè)類,引發(fā)類未定義異常。例7-7 類未定義異常例如 class NoClass public static void main(String args) anotherClass aCVar = new anotherClass(); 公共異常公共異常(7) NullPointerException異常。這是空指針異常。假設(shè)一個(gè)對(duì)象的值是null,而程序試圖訪問(wèn)它的變量或方法,或者訪問(wèn)一個(gè)空數(shù)組中的元素時(shí),都將導(dǎo)致該異常??聪旅娴睦?。例7-8 引發(fā)空指針異常例如 class NullObject public static void main
16、(String args) String oString = null;/空串 int aArray = null;/空數(shù)組 oString.length();/不能訪問(wèn)空串的方法 aArray0 = 0;/不能訪問(wèn)空數(shù)組的元素 程序中創(chuàng)建了兩個(gè)對(duì)象,分別是空字符串和沒(méi)有初始化的數(shù)組。對(duì)它們的訪問(wèn)都會(huì)導(dǎo)致空指針異常。公共異常公共異常(8) OutOfMemoryException異常。這是內(nèi)存溢出異常。當(dāng)系統(tǒng)無(wú)法再向運(yùn)用程序提供內(nèi)存時(shí),會(huì)引發(fā)該異常。這種異常只能出如今創(chuàng)建新對(duì)象的時(shí)候,即new被調(diào)用的時(shí)候。 例7-9 引發(fā)內(nèi)存溢出異常例如 class Link int a = new int1
17、000000; Link l; class NullObject public static void main(String args) Link root = new Link(); Link cur = root; while(true)/死循環(huán) cur.l = new Link();/總在懇求內(nèi)存 cur = cur.l; 公共異常公共異常(9) SecurityException異常。這是平安方面的異常,普通在閱讀器內(nèi)拋出。假設(shè)Java小程序試圖進(jìn)展不平安的操作時(shí),那么由SecurityManager類拋出此異常。 除此之外,還有以下常見異常:(10) ArrayStoreExcep
18、tion數(shù)組存取異常 程序試圖存取數(shù)組中錯(cuò)誤的數(shù)據(jù)類型。(11) FileNotFoundException文件不存在異常 試圖存取一個(gè)并不存在的文件。(12) IOExceptionI/O異常 通常的I/O錯(cuò)誤。拋出語(yǔ)句拋出語(yǔ)句 程序員處置異常有兩種方法。一是在異常發(fā)生的位置處立刻處置,即使用try語(yǔ)句將能夠出現(xiàn)異常的語(yǔ)句塊括住并預(yù)先估計(jì)能夠會(huì)發(fā)生的異常類,緊接其后運(yùn)用catch語(yǔ)句對(duì)這些異常類進(jìn)展相應(yīng)的處置。另一種方法是,程序員不在發(fā)生異常的當(dāng)前方法內(nèi)處置異常,而是把異常拋出到調(diào)用方法中。拋出的語(yǔ)句格式如下:訪問(wèn)權(quán)限修飾符 前往值類型 方法名 (參數(shù)列表) throws 異常列表緊接在關(guān)鍵
19、字throws后面的是該方法內(nèi)能夠發(fā)生且不進(jìn)展處置的一切異常列表。拋出的異??梢杂卸鄠€(gè),各異常之間以逗號(hào)分隔。父類子類異常處置例如父類子類異常處置例如例7-10 父類子類異常處置例如 import java.io.*; class Base/父類 public static void amethod() throws FileNotFoundException public class ExcepDemo extends Base/子類 /拋出的異常不同于父類同名方法拋出的異常,也不是它的子類 /編譯出錯(cuò) public static void amethod() throws IOExcept
20、ion 由于在父類中拋出的異常是FileNotFoundException,它是IOException異常的子類,所以上面的代碼不能被編譯。假設(shè)互換例7-10中拋出的兩個(gè)異常,即在父類中拋出IOException異常,在子類中的方法拋出FileNotFoundException,此時(shí)代碼正確。捕獲的錯(cuò)誤例如捕獲的錯(cuò)誤例如捕獲多個(gè)異常時(shí),異常類的派生關(guān)系也需求留意。應(yīng)該先捕獲特殊的異常,即異常子類,然后才干捕獲更普通的異常,即異常父類。 下面的代碼是錯(cuò)誤的: try DataInputStream dis = new DataInputStream(System.in); dis.read();
21、 catch (Exception ioe)/普通異常 catch (IOException e ) /編譯錯(cuò)誤! finally捕獲異常捕獲異常程序中,有些語(yǔ)句必需求捕獲異常,而有些由系統(tǒng)自動(dòng)完成。I/O操作必需捕獲異常,遍歷數(shù)組元素時(shí)不需求由程序員控制,系統(tǒng)自動(dòng)對(duì)數(shù)組做檢查。另外,捕獲異常的語(yǔ)句普通出如今能夠發(fā)生異常的代碼段,而不應(yīng)該放到控制程序執(zhí)行的語(yǔ)句段。捕獲異常捕獲異常程序7-6 I/O操作必需捕獲異常 import java.io.*; public class FileOut public static void main(String args) try FileReader
22、fr = new FileReader(FileOut.java); catch(Exception e) System.out.println(e.getMessage(); 在當(dāng)前目錄下查找文件FileOut.java,假設(shè)找不到,那么顯示一條錯(cuò)誤信息。創(chuàng)建本人的異常創(chuàng)建本人的異常 系統(tǒng)雖然曾經(jīng)定義了公共異常類,但這些往往還不能滿足實(shí)踐需求。編制程序中,除了運(yùn)用系統(tǒng)預(yù)定義的異常外,用戶還可以創(chuàng)建本人的異常。本人定義異常類時(shí),必需從已有的異常類來(lái)承繼,所以用戶自定義的一切異常類都必需間接或直接的是Exception的子類。創(chuàng)建異常例如創(chuàng)建異常例如程序7-7定義本人的異常 class MyEx
23、ception extends Exception private int detail; MyException (int aExcep) detail = aExcep; public String toString() return MyException + detail + ; class ExceptionDemo static void compute (int aExcep)throws MyException System.out.println(Called compute ( + aExcep + .); if (aExcep 10) throw new MyException (aExcep); System.out.println(Normal exit); pu
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 月嫂家政服務(wù)合同簽訂與風(fēng)險(xiǎn)防范
- 建筑模板工程分包施工合同
- 簡(jiǎn)易活動(dòng)房安裝合同書范本
- 專業(yè)采購(gòu)合同書樣
- 互聯(lián)網(wǎng)融資居間合同
- 低碳晶板采購(gòu)合同
- 抵押借款合同糾紛的訴訟途徑
- 公司借款合同協(xié)議書示例
- 高新技術(shù)產(chǎn)業(yè)創(chuàng)新平臺(tái)搭建計(jì)劃
- 企業(yè)內(nèi)部通訊系統(tǒng)使用及維護(hù)合同
- 電力行業(yè)電力調(diào)度培訓(xùn)
- 生態(tài)安全與國(guó)家安全
- 全力以赴備戰(zhàn)期末-2024-2025學(xué)年上學(xué)期備戰(zhàn)期末考試主題班會(huì)課件
- 2024年保密協(xié)議書(政府機(jī)關(guān))3篇
- 《視頻拍攝與制作:短視頻?商品視頻?直播視頻(第2版)》-課程標(biāo)準(zhǔn)
- 研發(fā)部年終總結(jié)和規(guī)劃
- 石油開采技術(shù)服務(wù)支持合同
- 山東省煙臺(tái)市2024屆高三上學(xué)期期末考試英語(yǔ)試題 含解析
- 公司戰(zhàn)略與風(fēng)險(xiǎn)管理戰(zhàn)略實(shí)施
- 2024年-2025年《農(nóng)作物生產(chǎn)技術(shù)》綜合知識(shí)考試題庫(kù)及答案
- 廣東省廣州市白云區(qū)2022-2023學(xué)年八年級(jí)上學(xué)期物理期末試卷(含答案)
評(píng)論
0/150
提交評(píng)論