版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、JAVA程序設(shè)計(jì)程序設(shè)計(jì)人民郵電出版社人民郵電出版社第第7章章 JAVA言語中的異常言語中的異常異常異常 編寫程序時多多少少總會有些錯誤,程序中的語法錯誤解在編譯時被發(fā)現(xiàn)并修正,而有些錯誤是發(fā)生在運(yùn)轉(zhuǎn)階段的。這些錯誤按照其嚴(yán)重程度分為兩類,一類是致命性的嚴(yán)重錯誤,它們的出現(xiàn)能夠會導(dǎo)致系統(tǒng)解體,并且程序員并不能編寫程序處理所出現(xiàn)的問題。另一類是普通級別的錯誤,這類錯誤假設(shè)不加控制就使程序非正常中斷,但假設(shè)編寫代碼來處置的話,就有能夠防止中斷程序的執(zhí)行。這類錯誤普通地稱為異常Exception,用來處置異常的過程稱為異常處置。異常異常在Java中主要有三類異?!,F(xiàn)實(shí)上,Java定義了類java.l
2、ang.Throwable,它是運(yùn)用異常處置機(jī)制可被拋出并捕獲的一切異常對象的父類。它有三個根本子類,如以下圖: 異常異常每個類的運(yùn)用目的不同。Error表示很難恢復(fù)的錯誤。普通不期望用戶程序來處置,即使程序員有才干處置這種錯誤,也還是交給系統(tǒng)處置為好。RuntimeException用來表示設(shè)計(jì)或?qū)崿F(xiàn)方面的問題。由于設(shè)計(jì)和實(shí)現(xiàn)正確的程序不會引發(fā)這類異常,所以經(jīng)常不處置它。發(fā)生這類異常時,運(yùn)轉(zhuǎn)時環(huán)境會輸出一條信息,提示用戶修正錯誤。其他異常表示運(yùn)轉(zhuǎn)時因環(huán)境的影響能夠發(fā)生并可被處置的問題。由于用戶的錯誤很能夠?qū)е逻@類問題發(fā)生,我們要學(xué)習(xí)的是如何處置這類異常。異常例如異常例如 例7-1 文件操作功
3、能描畫 openTheFile;/翻開文件 determine its size;/獲取文件的長度 allocate that much memory;/分配內(nèi)存 read-file;/讀文件 closeTheFile;/封鎖文件 實(shí)現(xiàn)文件讀取的程序大多有上述這樣的程序框架。由于文件存放在外存,程序要訪問文件時必需先要將文件放入內(nèi)存然后才干訪問。這段程序是順序執(zhí)行構(gòu)造,而前一句執(zhí)行的結(jié)果又直接影響后一句能否能執(zhí)行。假設(shè)中間哪一條語句執(zhí)行不正確,后續(xù)語句都不能正確執(zhí)行,程序也會中斷。所以凡是有輸入輸出操作的語句都能夠會出現(xiàn)問題。異常例如異常例如例7-2 添加了約束的文件操作功能描畫openFil
4、es; /翻開文件 if (theFilesOpen)/斷定翻開能否正確 determine the length of the file; /獲取文件的長度 if (gotTheFileLength)/斷定已得到文件長度 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 ;/沒有得到文件長度 else errorCode=-5;/文件翻開不正確異常異常 程序發(fā)生異常時稱為產(chǎn)生了一個異常事件,系統(tǒng)根據(jù)異常生成一個異常對象。根據(jù)這個異常的種類,該對象能夠由正在運(yùn)轉(zhuǎn)的方法生成,也能夠由JVM生成。異常對象中包含了該異常必要的詳細(xì)闡明信息,包括所發(fā)生的異常事件的類型及異常發(fā)生時程序的運(yùn)轉(zhuǎn)形狀。生成的異常對象傳送給Java運(yùn)轉(zhuǎn)時系統(tǒng),運(yùn)轉(zhuǎn)時系統(tǒng)尋覓相應(yīng)的代碼來處置這一異常。我們把生成異常對象并把它提交給運(yùn)轉(zhuǎn)時系統(tǒng)的這一過程稱為拋出throw一個異常。異常異常異常發(fā)生后,Java運(yùn)轉(zhuǎn)時系統(tǒng)從生成對象的代碼塊開場
6、進(jìn)展回溯,沿方法的調(diào)用棧逐層回溯尋覓處置代碼,并把異常對象交給該方法處置,這一過程稱為捕獲catch。如下圖: 異常處置方式例如異常處置方式例如下面用異常處置方式重寫例7-2。 try openTheFile;/翻開文件 determine its size;/獲取文件的長度 allocate that much memory;/分配內(nèi)存 read-File;/讀文件 closeTheFile;/封鎖文件 catch(fileopenFailed) /文件翻開失敗的處置代碼; catch(sizeDetermineFailed) /不能獲得文件大小的處置代碼; catch(memoryAllo
7、cateFailed) /內(nèi)存分配失敗的處置代碼; catch(readFailed) /讀文件失敗的處置代碼; catch(fileCloseFailed) /封鎖文件失敗的處置代碼; finally /需求一致處置的代碼; 異常類和錯誤類異常類和錯誤類Java言語在一切的預(yù)設(shè)包中都定義了異常類Exception和錯誤類Error。Exception類是一切異常的父類,Error類是一切錯誤的父類,這兩個類同時又是Throwable的子類。它們的層次構(gòu)造如下圖: 異常處置相關(guān)語句異常處置相關(guān)語句 雖然引發(fā)某個詳細(xì)異常的語句能夠是一條,但相關(guān)的語句能夠會有多條,程序中運(yùn)用try語句將這些語句全
8、部括住。 在try語句后面是一組catch語句,對所括住的語句能夠引發(fā)的異常進(jìn)展分類,對每一種類型的異常提供一段相應(yīng)的處置代碼,每種異常對應(yīng)一個catch語句。try與與catch語句語句 try與catch語句的語法格式如下: try / 此處為拋出詳細(xì)異常的代碼 catch (ExceptionType1 e) / 拋出ExceptionType1異常時要執(zhí)行的代碼 catch (ExceptionType2 e) / 拋出ExceptionType2異常時要執(zhí)行的代碼 . catch (ExceptionTypek e) / 拋出ExceptionTypek異常時要執(zhí)行的代碼 final
9、ly / 必需執(zhí)行的代碼 其中,ExceptionType1,ExceptionType2,ExceptionTypek是產(chǎn)生的異常類型。根據(jù)發(fā)生異常所屬的類,找到對應(yīng)的catch語句,然后執(zhí)行后面的語句序列。Finally語句語句異常處置中有一個特殊的語句,即finally語句。它是最后一條語句,Java規(guī)定,不論能否捕獲到異常,總要執(zhí)行finally后面的語句。即使try塊中包含return、break、continue、throw等語句,finally語句也會被執(zhí)行。finally語句不執(zhí)行的情況只需一種,即在維護(hù)代碼內(nèi)執(zhí)行了System.exit()方法后,將不再執(zhí)行finally后面
10、的語句,這是不執(zhí)行finally后面語句的獨(dú)一一種能夠。 公共處置例如公共處置例如例7-4 公共處置例如 try openfile ();/翻開文件 read_file();/讀文件 finally closefile();/封鎖文件 由于closefile ()方法放到了finally塊中,所以總被執(zhí)行。公共處置例如公共處置例如再看下面的例子。程序7-3總會輸出“finally,而“aftertry僅在aVar的值不等于10時才被輸出。程序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ù)不能為零。當(dāng)程序中出現(xiàn)除數(shù)為零,或在整數(shù)運(yùn)算中對零取模時,就會發(fā)生該類異常。如下面表達(dá)式將引發(fā)ArithmeticException異常: int i = 12 / 0;/除數(shù)為0 float avar = 12 % 0; /對0取模公共異常公共異常 (2) ArrayIndexOutOfBound
12、sException異常。這是數(shù)組下標(biāo)越界異常。數(shù)組元素的個數(shù)在數(shù)組初始化時曾經(jīng)確定下來,程序中訪問數(shù)組元素時,不能超越數(shù)組的長度。系統(tǒng)根據(jù)length值來檢查數(shù)組下標(biāo)表達(dá)式,假設(shè)超出這個值,那么將導(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)修正一個類的定義后,援用該類的其它類沒有重
13、新編譯,就會產(chǎn)生該異常。對應(yīng)的情況有以下兩類: 一個類中的變量聲明由靜態(tài)變成非靜態(tài),或由非靜態(tài)變成靜態(tài),而其它訪問該類這一變量的類沒有被重新編譯。 類中聲明的某個域或是某個方法被刪除,而其它訪問該域或該方法的類沒有被重新編譯。(4) IncompatibleTypeException異常。這是類型不兼容異常。名字雖然與前一個異常很類似,但含義不一樣。假設(shè)試圖定義一個接口的實(shí)例,那么會引發(fā)IncompatibleTypeException異常。公共異常公共異常(5) NegativeArraySizeException異常。這是數(shù)組元素個數(shù)為負(fù)異常。數(shù)組長度應(yīng)該是一個大于等于0的整數(shù),所以定義數(shù)
14、組時,方括號中的數(shù)不能寫負(fù)數(shù)。當(dāng)然,假設(shè)定義一個元素個數(shù)為零的數(shù)組是沒有運(yùn)用價值的,所以也應(yīng)該防止。創(chuàng)建數(shù)組時,假設(shè)指定的元素個數(shù)是個負(fù)數(shù),那么會引發(fā)該異常。例7-6 引發(fā)數(shù)組元素個數(shù)為負(fù)異常例如 class NegArray public static void main(String args) int aVar = new int-1;/數(shù)組元素個數(shù)不能是負(fù)數(shù) aVar0 = 0; 公共異常公共異常(6) NoClassDefFoundException異常。這是類未定義異常。假設(shè)一個類被援用,但在運(yùn)轉(zhuǎn)時,系統(tǒng)沒有找到被援用的類,就會引發(fā)該異常。 例如,聲明一個NoClass類,其中用到
15、了另一個類anotherClass,但系統(tǒng)找不到這個類,引發(fā)類未定義異常。例7-7 類未定義異常例如 class NoClass public static void main(String args) anotherClass aCVar = new anotherClass(); 公共異常公共異常(7) NullPointerException異常。這是空指針異常。假設(shè)一個對象的值是null,而程序試圖訪問它的變量或方法,或者訪問一個空數(shù)組中的元素時,都將導(dǎo)致該異常??聪旅娴睦印@?-8 引發(fā)空指針異常例如 class NullObject public static void main
16、(String args) String oString = null;/空串 int aArray = null;/空數(shù)組 oString.length();/不能訪問空串的方法 aArray0 = 0;/不能訪問空數(shù)組的元素 程序中創(chuàng)建了兩個對象,分別是空字符串和沒有初始化的數(shù)組。對它們的訪問都會導(dǎo)致空指針異常。公共異常公共異常(8) OutOfMemoryException異常。這是內(nèi)存溢出異常。當(dāng)系統(tǒng)無法再向運(yùn)用程序提供內(nèi)存時,會引發(fā)該異常。這種異常只能出如今創(chuàng)建新對象的時候,即new被調(diào)用的時候。 例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)展不平安的操作時,那么由SecurityManager類拋出此異常。 除此之外,還有以下常見異常:(10) ArrayStoreExcep
18、tion數(shù)組存取異常 程序試圖存取數(shù)組中錯誤的數(shù)據(jù)類型。(11) FileNotFoundException文件不存在異常 試圖存取一個并不存在的文件。(12) IOExceptionI/O異常 通常的I/O錯誤。拋出語句拋出語句 程序員處置異常有兩種方法。一是在異常發(fā)生的位置處立刻處置,即使用try語句將能夠出現(xiàn)異常的語句塊括住并預(yù)先估計(jì)能夠會發(fā)生的異常類,緊接其后運(yùn)用catch語句對這些異常類進(jìn)展相應(yīng)的處置。另一種方法是,程序員不在發(fā)生異常的當(dāng)前方法內(nèi)處置異常,而是把異常拋出到調(diào)用方法中。拋出的語句格式如下:訪問權(quán)限修飾符 前往值類型 方法名 (參數(shù)列表) throws 異常列表緊接在關(guān)鍵
19、字throws后面的是該方法內(nèi)能夠發(fā)生且不進(jìn)展處置的一切異常列表。拋出的異??梢杂卸鄠€,各異常之間以逗號分隔。父類子類異常處置例如父類子類異常處置例如例7-10 父類子類異常處置例如 import java.io.*; class Base/父類 public static void amethod() throws FileNotFoundException public class ExcepDemo extends Base/子類 /拋出的異常不同于父類同名方法拋出的異常,也不是它的子類 /編譯出錯 public static void amethod() throws IOExcept
20、ion 由于在父類中拋出的異常是FileNotFoundException,它是IOException異常的子類,所以上面的代碼不能被編譯。假設(shè)互換例7-10中拋出的兩個異常,即在父類中拋出IOException異常,在子類中的方法拋出FileNotFoundException,此時代碼正確。捕獲的錯誤例如捕獲的錯誤例如捕獲多個異常時,異常類的派生關(guān)系也需求留意。應(yīng)該先捕獲特殊的異常,即異常子類,然后才干捕獲更普通的異常,即異常父類。 下面的代碼是錯誤的: try DataInputStream dis = new DataInputStream(System.in); dis.read();
21、 catch (Exception ioe)/普通異常 catch (IOException e ) /編譯錯誤! finally捕獲異常捕獲異常程序中,有些語句必需求捕獲異常,而有些由系統(tǒng)自動完成。I/O操作必需捕獲異常,遍歷數(shù)組元素時不需求由程序員控制,系統(tǒng)自動對數(shù)組做檢查。另外,捕獲異常的語句普通出如今能夠發(fā)生異常的代碼段,而不應(yīng)該放到控制程序執(zhí)行的語句段。捕獲異常捕獲異常程序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è)找不到,那么顯示一條錯誤信息。創(chuàng)建本人的異常創(chuàng)建本人的異常 系統(tǒng)雖然曾經(jīng)定義了公共異常類,但這些往往還不能滿足實(shí)踐需求。編制程序中,除了運(yùn)用系統(tǒng)預(yù)定義的異常外,用戶還可以創(chuàng)建本人的異常。本人定義異常類時,必需從已有的異常類來承繼,所以用戶自定義的一切異常類都必需間接或直接的是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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 從傳統(tǒng)到現(xiàn)代農(nóng)業(yè)科技合資項(xiàng)目的未來展望
- 以實(shí)驗(yàn)教學(xué)促進(jìn)小學(xué)科學(xué)的理論與實(shí)踐結(jié)合
- 創(chuàng)意策劃在教育行業(yè)的應(yīng)用前景
- 陜西省大額現(xiàn)金支付管理實(shí)施細(xì)則
- 從健康心理學(xué)的角度探討學(xué)生作業(yè)負(fù)擔(dān)的管理策略
- 創(chuàng)造性學(xué)習(xí)環(huán)境下的學(xué)生成長與發(fā)展
- 護(hù)理學(xué)模擬題及答案
- 交通行業(yè)中的安全文化推廣
- 不同文化背景下的服務(wù)溝通策略解析
- 從太陽到家溫暖你的每一天-家用太陽能供暖系統(tǒng)介紹
- 《中醫(yī)養(yǎng)生腎》課件
- 2024年二級建造師考試建筑工程管理與實(shí)務(wù)試題及解答參考
- 生產(chǎn)車間關(guān)鍵崗位培訓(xùn)
- 鄉(xiāng)鎮(zhèn)(街道)和村(社區(qū))應(yīng)急預(yù)案編制管理百問百答
- 醫(yī)院培訓(xùn)課件:《乳腺癌解讀》
- 中國高血壓防治指南(2024年修訂版)核心要點(diǎn)解讀
- 湖州師范學(xué)院《中學(xué)歷史教學(xué)論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年人教版八年級語文上冊期末考試卷(附答案)
- 汽車乘員仿真RAMSIS操作指南
- 《鄉(xiāng)土中國》家族與男女有別 課件 統(tǒng)編版高中語文必修上冊
- 遼寧省大連市2023-2024學(xué)年高三上學(xué)期雙基測試(期末考試) 物理 含解析
評論
0/150
提交評論