版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
人民郵電出版社8異常處理Java程序設(shè)計(jì)第章導(dǎo)讀Introduction在程序設(shè)計(jì)過(guò)程中,經(jīng)常會(huì)出現(xiàn)程序錯(cuò)誤的情況,Java將這樣的錯(cuò)誤定義成異常,并提供了檢測(cè)與處理方法。C目錄ONTENTS8.2異常處理8.3用斷言調(diào)試程序8.4小結(jié)8.1異常8.1.1異常的概念程序在運(yùn)行過(guò)程中,有時(shí)會(huì)出現(xiàn)一些錯(cuò)誤,這些錯(cuò)誤會(huì)中斷當(dāng)前程序的執(zhí)行。Java把這類導(dǎo)致程序中斷運(yùn)行的錯(cuò)誤稱為異常。Java中提供了一系列的方法用于捕獲、處理這些異常。8.1.2異常的類型在Java中,所有的異常均當(dāng)作對(duì)象來(lái)處理,即當(dāng)發(fā)生異常時(shí)產(chǎn)生了異常對(duì)象。java.lang.Throwable類是Java中所有錯(cuò)誤類或異常類的根類,兩個(gè)重要子類是Error類和Exception類。1.Error類java.lang.Error類是程序無(wú)法處理的錯(cuò)誤,如OutOfMemoryError、StackOverflowError等。這些錯(cuò)誤都需交由系統(tǒng)進(jìn)行處理。2.Exception類java.lang.Exception類是程序本身可以處理的異常。分為可查(checked)異常和不可查(unchecked)異常。8.1.2異常的類型不可查異常是指在運(yùn)行中可能出現(xiàn)的異常,這種異常無(wú)法在編譯時(shí)檢查出來(lái),在運(yùn)行過(guò)程中有可能出現(xiàn)也有可能不出現(xiàn),所以這類異常在程序中可以選擇捕獲處理,也可以不處理。這類異常通常是由程序邏輯錯(cuò)誤引起的,所以程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。不可查異常都是RuntimeException類及其子類異常??刹楫惓J侵冈诰幾g時(shí)被強(qiáng)制檢查的異常,這種異常是可以預(yù)見(jiàn)的,所以必須在程序中進(jìn)行處理,即或者進(jìn)行捕獲并處理,或者明確拋出給上一級(jí)主調(diào)進(jìn)行處理,否則編譯無(wú)法通過(guò)。RuntimeException以外的異常都屬于可查異常。8.1.2異常的類型ThrowableErrorExceptionAssertionErrorVirtualMachineErrorAWTErrorIOErrorThreadDeathLinkageErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorClassNotFoundExceptionRuntimeExceptionDataFormatExceptionIllegalAccessExceptionNoSuchMethodExceptionArithmeticExceptionSystemExceptionNullPointerExceptionIOExceptionEOFExceptionFileNotFoundExceptionSocketException8.1.3程序中的常見(jiàn)異常01OPTIONArithmeticExecption異常數(shù)學(xué)運(yùn)算異常。例如程序中出現(xiàn)了除數(shù)為0的運(yùn)算,就會(huì)拋出該異常。02OPTIONNullPointerException異??罩羔槷惓?。例如當(dāng)應(yīng)用試圖在要求使用對(duì)象的地方使用了null時(shí),就會(huì)拋出該異常。03OPTIONNegativeArraySizeException異常數(shù)組大小為負(fù)值異常。例如當(dāng)使用負(fù)數(shù)大小值創(chuàng)建數(shù)組時(shí),就會(huì)拋出該異常。8.1.3程序中的常見(jiàn)異常06OPTION05OPTIONNumberFormatException異常數(shù)字格式異常。當(dāng)試圖將一個(gè)String轉(zhuǎn)換為指定的數(shù)字類型,而該字符串確不滿足數(shù)字類型要求的格式時(shí),就會(huì)拋出該異常。InputMismatchException異常輸入類型不匹配異常。它由Scanner拋出,當(dāng)讀取的數(shù)據(jù)類型與期望類型不匹配,就會(huì)拋出該異常。04OPTIONArrayIndexOutOfBoundsException異常數(shù)組下標(biāo)越界異常。如當(dāng)訪問(wèn)某個(gè)序列的索引值小于0或大于等于序列大小,就會(huì)拋出該異常。8.1.3程序中的常見(jiàn)異常07OPTION08OPTIONDataFormatException異常數(shù)據(jù)格式錯(cuò)誤異常。當(dāng)數(shù)據(jù)格式發(fā)生錯(cuò)誤時(shí),就會(huì)拋出該異常。NoSuchMethodException異常方法不存在異常。當(dāng)無(wú)法找到某一特定方法時(shí),就會(huì)拋出該異常。09OPTIONNoClassDefFoundError錯(cuò)誤未找到類定義錯(cuò)誤。當(dāng)Java虛擬機(jī)或者類裝載器試圖實(shí)例化某個(gè)類,而找不到該類的定義時(shí),就會(huì)拋出該錯(cuò)誤。8.1.3程序中的常見(jiàn)異常10OPTIONOutOfMemoryError錯(cuò)誤內(nèi)存不足錯(cuò)誤。當(dāng)可用內(nèi)存不足以讓Java虛擬機(jī)分配給一個(gè)對(duì)象時(shí),就會(huì)拋出該錯(cuò)誤。11OPTIONStackOverflowError錯(cuò)誤堆棧溢出錯(cuò)誤。當(dāng)一個(gè)應(yīng)用遞歸調(diào)用的層次太深而導(dǎo)致堆棧溢出時(shí),就會(huì)拋出該錯(cuò)誤。12OPTIONThreadDeath錯(cuò)誤線程結(jié)束。當(dāng)調(diào)用Thread類的stop方法時(shí)就會(huì)拋出該錯(cuò)誤,用于指示線程結(jié)束。13OPTIONUnknownError錯(cuò)誤未知錯(cuò)誤。用于指示Java虛擬機(jī)發(fā)生了未知嚴(yán)重錯(cuò)誤的情況。C目錄ONTENTS8.2異常處理8.3用斷言調(diào)試程序8.4小結(jié)8.1異常8.2.1Java異常處理機(jī)制在Java應(yīng)用程序中,對(duì)異常的處理機(jī)制分為拋出異常和捕獲異常。1.拋出異常如果一個(gè)方法在數(shù)據(jù)處理過(guò)程中產(chǎn)生了異常,這時(shí)該方法會(huì)創(chuàng)建一個(gè)異常對(duì)象交給JVM進(jìn)行處理。異常對(duì)象中包含了該異常的類型和異常出現(xiàn)時(shí)的程序狀態(tài)等信息。JVM接到這個(gè)異常對(duì)象后從這個(gè)方法開(kāi)始按調(diào)用棧回溯查找合適的處理程序并執(zhí)行。8.2.1Java異常處理機(jī)制2.捕獲異常當(dāng)方法拋出異常之后,JVM從發(fā)生異常的方法開(kāi)始,首先查找該方法中是否有處理該異常的代碼,如果有則處理該異常;如果沒(méi)有,則查找調(diào)用該方法的方法中是否有處理該異常的代碼,依次回溯,直至找到含有合適的處理代碼并執(zhí)行異常處理。如果查找到最后仍沒(méi)有找到,則JVM終止程序的運(yùn)行。8.2.1Java異常處理機(jī)制2.異常的處理方法對(duì)于不可查異常、錯(cuò)誤或可查異常,Java對(duì)相應(yīng)的異常處理方式有所不同。RuntimeException異常屬于不可查異常,其通常發(fā)生在程序運(yùn)行期間。運(yùn)行時(shí)異??捎蒍ava運(yùn)行時(shí)系統(tǒng)自動(dòng)拋出,允許應(yīng)用程序忽略這類異常。對(duì)于方法運(yùn)行中可能出現(xiàn)的Error,如果此方法不對(duì)其進(jìn)行捕獲,Java也允許該方法不做任何拋出聲明。對(duì)于所有的可查異常,一個(gè)方法必須捕捉異常,或聲明拋出該異常到方法之外。任何Java代碼都可拋出異常,其可以使用throw語(yǔ)句拋出異常。如果一個(gè)方法不想對(duì)自己產(chǎn)生的異常進(jìn)行捕獲和處理,則在方法聲明時(shí)使用throws子句拋出該異常。捕獲異常是通過(guò)try-catch語(yǔ)句或者try-catch-finally語(yǔ)句實(shí)現(xiàn)。Java要求所有的可查異常必須被捕獲或者聲明拋出,而對(duì)于不可查異常RuntimeException和錯(cuò)誤異常Error可以忽略。8.2.2try-catch-finally處理異常1.語(yǔ)句結(jié)構(gòu)try{//正常數(shù)據(jù)處理但可能會(huì)發(fā)生異常的程序代碼}catch(異常類型1e){//捕獲并處理try拋出的異常類型1}catch(異常類型2e){//捕獲并處理try拋出的異常類型2}…catch(異常類型ne){//捕獲并處理try拋出的異常類型n}finally{ //對(duì)try語(yǔ)句塊進(jìn)行的后續(xù)處理}【例8.1】捕獲并處理算術(shù)運(yùn)行異常。Example8_01.java8.2.2try-catch-finally處理異常逐一執(zhí)行try語(yǔ)句塊中的語(yǔ)句,如果沒(méi)有產(chǎn)生任何異常,則程序會(huì)跳過(guò)所有catch語(yǔ)句塊,執(zhí)行finally語(yǔ)句塊和其后的語(yǔ)句。如果try語(yǔ)句塊中產(chǎn)生了異常,則不再執(zhí)行try語(yǔ)句塊中后續(xù)程序,而是跳到catch語(yǔ)句塊,并與catch語(yǔ)句塊逐一匹配,找到對(duì)應(yīng)的異常處理程序并執(zhí)行。執(zhí)行完后,繼續(xù)執(zhí)行finally語(yǔ)句塊以及后續(xù)的程序語(yǔ)句,其他的catch語(yǔ)句塊將不會(huì)被執(zhí)行。如果catch語(yǔ)句塊中沒(méi)有匹配該異常的程序代碼,則將該異常拋給JVM進(jìn)行處理,finally語(yǔ)句塊中的語(yǔ)句仍會(huì)被執(zhí)行,但finally語(yǔ)句塊后的其他語(yǔ)句不會(huì)被執(zhí)行。2.try-catch-finally語(yǔ)句執(zhí)行過(guò)程8.2.2try-catch-finally處理異常必須在try之后添加catch或finally塊。try塊后可同時(shí)接catch和finally塊,但至少有一個(gè)塊。若同時(shí)使用catch和finally塊,則必須將catch塊放在try塊之后??汕短譼ry-catch-finally結(jié)構(gòu),在try-catch-finally結(jié)構(gòu)中,可重新拋出異常。3.try-catch-finally語(yǔ)句的使用規(guī)則8.2.3throw拋出異常throw語(yǔ)句的語(yǔ)法格式為:throw異常類對(duì)象;執(zhí)行throw語(yǔ)句,會(huì)拋出一個(gè)Throwable類型的異常。程序會(huì)在throw語(yǔ)句后立即終止,它后面的語(yǔ)句不再執(zhí)行,然后在包含它的所有try塊中(包括在上層調(diào)用方法中)從里向外尋找含有與其匹配的catch子句。例如:thrownewIOException();【例8.2】使用throw語(yǔ)句拋出異常。Example8_02.java8.2.4
自定義異常類Java允許用戶根據(jù)需要自定義異常類自定義異常類必須繼承自Exception類。自定義異常類的使用與系統(tǒng)定義的異常類的使用方法完全相同?!纠?.3】從鍵盤(pán)錄入用戶的姓名和年齡信息,要求年齡不能是負(fù)數(shù)。試用異常處理機(jī)制完成程序設(shè)計(jì)。Example8_03.java8.2.5方法聲明拋出異常如果一個(gè)方法可能會(huì)出現(xiàn)異常,但該方法不想或不能處理這種異常,可以在方法聲明時(shí)用throws關(guān)鍵字來(lái)聲明拋出異常?!纠?.4】數(shù)組越界訪問(wèn)的異常拋出與處理Example8_04.java1.throws關(guān)鍵字throws語(yǔ)句的語(yǔ)法格式為:類型方法名([參數(shù)表列])
throws
異常類1,異常類2,...{//…方法體}當(dāng)方法拋出異常列表中的異常時(shí),方法將不對(duì)這些類型及其子類的異常作處理,而是拋給調(diào)用該方法的主調(diào)方法,由主調(diào)方法來(lái)進(jìn)行處理異常。8.2.5方法聲明拋出異常如果產(chǎn)生的異常是不可查異常,可以不使用throws關(guān)鍵字來(lái)聲明要拋出的異常,編譯仍能順利通過(guò),但在運(yùn)行時(shí)會(huì)被系統(tǒng)拋出。如果方法中產(chǎn)生的異常是可查異常,要求或者用try-catch語(yǔ)句捕獲,或者用throws子句聲明將它拋出,否則會(huì)導(dǎo)致編譯錯(cuò)誤。只有拋出了異常,該方法的調(diào)用者才能處理或者重新拋出該異常。當(dāng)方法的調(diào)用者無(wú)法處理該異常時(shí),應(yīng)該繼續(xù)向上拋出,而不應(yīng)放棄。2.throws拋出異常的規(guī)則8.2.6finally和returnreturn語(yǔ)句可以出現(xiàn)在try、catch、finally的任何一個(gè)地方。如果try子句中沒(méi)有產(chǎn)生異常,則一直執(zhí)行到return語(yǔ)句,包括return語(yǔ)句中的表達(dá)式,并在返回值已經(jīng)確定的情況下先跳轉(zhuǎn)至finally子句中的語(yǔ)句,執(zhí)行完畢再返回。如果try子句中產(chǎn)生了異常,則異常之后的try語(yǔ)句都不再執(zhí)行,直接跳轉(zhuǎn)到catch子句中繼續(xù)執(zhí)行。如果catch中有return語(yǔ)句,則與上述相似,一直執(zhí)行到return語(yǔ)句,包括return語(yǔ)句中的表達(dá)式,在返回值已經(jīng)確定的情況下先跳轉(zhuǎn)至finally子句中的語(yǔ)句,執(zhí)行完畢再返回。如果在finally子句中有return語(yǔ)句,則一定會(huì)從該return語(yǔ)句返回,其他所有return語(yǔ)句都不會(huì)被執(zhí)行。Java不建議在finally中放置return語(yǔ)句,因?yàn)闀?huì)產(chǎn)生一個(gè)warning。C目錄ONTENTS8.2異常處理8.3用斷言調(diào)試程序8.4小結(jié)8.1異常8.3用斷言調(diào)試程序斷言語(yǔ)句(as
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理感染控制與公共衛(wèi)生競(jìng)賽
- 2.6.6.3精神科危重患者護(hù)理常規(guī)學(xué)習(xí)培訓(xùn)課件
- 大豐市小海中學(xué)高二生物三同步課程講義第講免疫調(diào)節(jié)(四)
- 2025年辦公設(shè)備維修服務(wù)協(xié)議
- 《液體劑型保健用品生產(chǎn)技術(shù)規(guī)范》標(biāo)準(zhǔn) 征求意見(jiàn)稿
- 基于大數(shù)據(jù)的電子支付異常監(jiān)測(cè)系統(tǒng)
- 2025年養(yǎng)寵訓(xùn)練新工具 正向激勵(lì)A(yù)I助手評(píng)測(cè)
- 城市交通智能調(diào)控-第2篇
- 基于AI的注入攻擊檢測(cè)
- 2026 年中職掘進(jìn)技術(shù)(隧道施工基礎(chǔ))試題及答案
- 2025年沈陽(yáng)華晨專用車有限公司公開(kāi)招聘?jìng)淇脊P試題庫(kù)及答案解析
- 2025年云南省人民檢察院聘用制書(shū)記員招聘(22人)筆試考試參考試題及答案解析
- 2025天津市第二批次工會(huì)社會(huì)工作者招聘41人考試筆試備考試題及答案解析
- 江西省三新協(xié)同體2025-2026年高一上12月地理試卷(含答案)
- 2025新疆維吾爾自治區(qū)哈密市法院、檢察院系統(tǒng)招聘聘用制書(shū)記員(31人)筆試考試參考試題及答案解析
- 空調(diào)安全知識(shí)培訓(xùn)
- 2025重慶醫(yī)科大學(xué)附屬兒童醫(yī)院宜賓醫(yī)院招聘34人考試筆試備考題庫(kù)及答案解析
- 《醫(yī)學(xué)倫理》期末考試復(fù)習(xí)題庫(kù)(含答案)
- 初中生金融知識(shí)
- 暖通設(shè)備運(yùn)行調(diào)試方案
- 流感相關(guān)知識(shí)試題及答案
評(píng)論
0/150
提交評(píng)論