版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、10.異常處理講師:瘋狂軟件 本章要點 異常處理的意義 使用try.catch.finally 異常的繼承體系 Checked異常與Runtime異常 throws與throw 自定義異常 異常跟蹤棧瘋狂軟件 異常概述 異常處理已經(jīng)成為衡量一門語言是否成熟的標(biāo)準(zhǔn)之一,目前的主流編程語言如C+、C#、Ruby、Python等,大都提供了異常處理機制。增加了異常處理機制后的程序有更好的容錯性,更加健壯。瘋狂軟件 傳統(tǒng)錯誤處理的缺陷 傳統(tǒng)錯誤處理機制,主要如下兩個缺點: 無法窮舉所有異常情況:因為人類知識的限制, 異
2、常情況總比可以考慮到的情況多,總有“漏 網(wǎng)之魚”的異常情況,所以程序總是不夠健壯。 錯誤處理代碼和業(yè)務(wù)實現(xiàn)代碼混雜:這種錯誤處理和業(yè)務(wù)實現(xiàn)混雜的代碼嚴(yán)重影響程序的可讀性,會增加程序維護的難度。瘋狂軟件 使用try.catch捕獲異常 執(zhí)行try塊里的業(yè)務(wù)邏輯代碼時出現(xiàn)異常,系統(tǒng)自動生成一個異常對象,該異常對象被提交給Java 運行時環(huán)境,這個過程被稱為拋出(throw)異常。 Java運行時環(huán)境收到異常對象時,會尋找能處理該異常對象的catch塊,如果找到合適的catch塊并把該異常對象交給該catch塊處理,那這個過程被稱為捕獲(catch)異常;如果Java運行
3、時環(huán)境找不到捕獲異常的catch塊,則運行時環(huán)境終止, Java程序也將退出。瘋狂軟件 軟件一技術(shù)沉淀最厚的高級軟件培訓(xùn)專家異異常常的的捕捕捉捉流流程程S掃:tement啤ement2統(tǒng) 生 成 異市 對 蘇 邸出e x ins詛nceof 巳(C佴one但ss1=寸rue向catch忙 oepti onC伯:SS1 e1會下行:i郅 c,epll on hander statemen1.1忐部inslanceof E 歡 eptionCI 邸 s2=t rue ca忙h廬 cepli onC伯ss2 e2) 喊 - . . .-.書.瑾J 暑.暑J 暑.昌 I 侵
4、 喇I 心. 爐邑_,. exceptiion handler sta汜ment2雪.志術(shù)成就輝煌瘋狂軟件 Java的異常體系瘋狂軟件 訪問異常信息 如果程序需要在catch塊中訪問異常對象的相關(guān)信息,可以通過調(diào)用catch后異常形參的方法來獲得。當(dāng)Java運行時決定調(diào)用某個catch塊來處理該異常對象時,會將該異常對象賦給catch塊后的異常參數(shù),程序就可以通過該參數(shù)來獲得該異常的相關(guān)信息。 所有異常對象都包含了如下幾個常用方法: getMessage():返回該異常的詳細(xì)描述字符串。 printStackTrace():將該異常的跟蹤
5、棧信息輸出到標(biāo)準(zhǔn)錯誤輸出。 printStackTrace(PrintStream s):將該異常的跟蹤棧信息輸出到指定輸出流。 getStackTrace():返回該異常的跟蹤棧信息。瘋狂軟件 異常處理try需要檢測的代碼;catch(異常類 變量)異常處理代碼;finally一定會執(zhí)行的代碼;Finally代碼塊只有一種情況不會被執(zhí)行。就是在之前執(zhí)行了System.exit(0)。瘋狂軟件 Java 7提供的多異常捕捉 在Java 7以前,每個catch塊只能捕捉一個異常。從Java 7開始,一個catch塊可以捕捉多個異常。 cat
6、ch(異常1 | 異常 2 | 異常3 ex) 多個異常之間用豎線隔開。 多異常捕捉時,異常變量之前有隱式final 修飾。瘋狂軟件 使用finally回收資源 程序在try塊里打開了一些物理資源(例如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件等), 這些物理資源都必須顯式回收。 為了保證一定能回收try塊中打開的物理資源,異常處理機制提供了finally塊。不管try塊中的代碼是否出現(xiàn)異常,也不管哪一個catch塊被執(zhí)行,finally塊總會被執(zhí)行。瘋狂軟件 異常處理的嵌套 異常處理流程代碼可以放在任何能放可執(zhí)行性代碼的地方,因此完整的異常處理流程
7、既可放在try塊里,也可放在catch塊里, 也可放在finally塊里。 異常處理嵌套的深度沒有很明確的限制, 但通常沒有必要使用超過兩層的嵌套異常處理,層次太深的嵌套異常處理沒有太大不要,而且導(dǎo)致程序可讀性降低。瘋狂軟件 Java 9的自動關(guān)閉資源的try語句 try( / 此處聲明的資源, 系統(tǒng)可以自動關(guān)閉它。)/ 對于自動關(guān)閉資源的try語句, 可以沒有catch和finallytry塊可以孤獨地存在。 Java 9允許在圓括號之外聲明、創(chuàng)建資源,只要在圓括號里列出需要自動關(guān)閉的資源即可,多個資源之間用英文逗號隔開。 自動關(guān)閉資源的try語句,有兩個注意點:
8、 只有放在try后面的圓括號里的資源才會被關(guān)閉。 能被自動關(guān)閉的資源必須實現(xiàn)Closeable或AutoCloseable接口。瘋狂軟件 Checked異常與Runtime異常 Java的異常被分為兩大類:Checked異常和Runtime異常(運行時異常)。所有RuntimeException類及其子類的實例被稱為Runtime異常;不是RuntimeException類及其子類的異常實例則被稱為Checked異常。瘋狂軟件 Checked異常的處理 當(dāng)前方法明確知道如何處理該異常,程序應(yīng)該使用try.catch塊來捕獲該異常,然后在對
9、應(yīng)的catch塊中修改該異常。例如前面介紹的五子棋游戲中處理用戶輸入不合法的異常,程序在catch塊中打印對用戶的提示信息,重新開始下一次循環(huán)。 當(dāng)前方法不知道如何處理這種異常,應(yīng)該在定義該方法時聲明拋出該異常。瘋狂軟件 Runtime異常的處理 Runtime異常則更加靈活,Runtime異常無需顯式聲明拋出。 如果程序需要捕捉Runtime異常,也可以使用try.catch塊來捕捉Runtime異常。瘋狂軟件 使用throws聲明拋出異常 throws聲明拋出異常的思路是:當(dāng)前方法不知道應(yīng)該如何這種類型的異常,該異常應(yīng)該由上一級調(diào)用者
10、處理,如果main方法也不知道應(yīng)該如何處理這種類型的異常,也可以使用throws聲明拋出異常,該異常將交給JVM處理。JVM對異常的處理方法是:打印異常跟蹤棧信息,并中止程序運行,這就是前面程序在遇到異常后自動結(jié)束的原因。 throws聲明拋出只能在方法簽名中使用,throws 可以聲明拋出多個異常類,多個異常類之間以逗號隔開。throws聲明拋出的語法格式如下 throws ExceptionClass1 , ExceptionClass2.瘋狂軟件 拋出異常 如果需要在程序中自行拋出異常,應(yīng)使用throw語句, throw語句可以單獨使用,throw語句拋出的不
11、是異常類, 而是一個異常實例,而且每次只能拋出一個異常實例。throw語句的語法格式如下: throw ExceptionInstance; 如果throw語句拋出的異常是Checked異常,則該throw語句要么處于try塊里,顯式捕獲該異常,要么放在一個帶throws聲明拋出的方法中,即把該異常交給該方法的調(diào)用者處理。瘋狂軟件 Java 7增強的throw語句 try new FileInputStream(“a.txt”); Catch(Exception ex) ex.printStackTrace(); throw ex;/ 從JDK 7開始,Java編譯
12、器可以只能地識別號代碼處拋出的異常只是FileNotFoundException異常。瘋狂軟件 自定義異常類 ,程序很少會自行拋出系統(tǒng)異常,因 常的類名通常包含了該異常的有用信息。所以在選擇拋出什么異常時,應(yīng)該選擇合適的異常類,從而可以明確地描述該異常情況。在這種情形下,應(yīng)用程序常常需要拋出自定義異常。 用戶自定義異常都應(yīng)該繼承Exception基類,如果希望自定義Runtime異常,則應(yīng)該繼承RuntimeException基類。定義異常類時通常需要提供兩種構(gòu)造器:一個是無參數(shù)的構(gòu)造器;另一個是帶一個字符串參數(shù)的構(gòu)造器,這個字符串將作為該異常對象的詳細(xì)說明(也就是
13、異常對象的getMessage方法的返回值)。瘋狂軟件 異常鏈 當(dāng)業(yè)務(wù)邏輯層訪問持久層出現(xiàn)SQLException異常時,程序不應(yīng)該把底層的SQLException異常傳到用戶界面,原因有如下兩個: 對于正常用戶而言,他們不想看到底層SQLException,SQLException對他們使用該系統(tǒng)沒有任何幫助。 對于惡意用戶而言,將SQLException暴露出來是一種不安全的。瘋狂軟件 Java的異常跟蹤棧 異常對象的printStackTrace方法用于打印異常的跟蹤棧信息,根據(jù)printStackTrace方法的輸出結(jié)果,我們可以
14、找到異常的源頭,并跟蹤到異常一路觸發(fā)的過程。 面向?qū)ο蟮膽?yīng)用程序運行時,經(jīng)常會發(fā)生一系列方法調(diào)用,從而形成“方法調(diào)用?!保惓5膫鞑t與相反: 只要異常沒有被完全捕獲(包括異常沒有 獲,或異常被處理后重新拋出了新異常),異常從發(fā)生異常的方法逐漸向外傳播,首先傳給該方法的調(diào)用者,該方法調(diào)用者再次創(chuàng)給其調(diào)用者直至最后傳到 main方法,如果main方法依然沒有處理該異常,JVM會中止該程序, 并打印異常的跟蹤棧信息。瘋狂軟件 Java的異常跟蹤棧 異常對象的printStackTrace方法用于打印異常的跟蹤棧信息,根據(jù)printStackTrace方法的輸出結(jié)果,我們可以找到異常的源頭,并跟蹤到異常一路觸發(fā)的過程。 面向?qū)ο蟮膽?yīng)用程序運行時,經(jīng)常會發(fā)生一系列方法調(diào)用,從而形成“方法調(diào)用?!?,異常的傳播則與相反: 只要異常
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代短詩遠和近
- 石河子大學(xué)《通信原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《葡萄酒市場學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《大數(shù)據(jù)分析與可視化》2023-2024學(xué)年期末試卷
- 沈陽理工大學(xué)《優(yōu)化理論與方法》2021-2022學(xué)年第一學(xué)期期末試卷
- 腫瘤患者的飲食營養(yǎng)護理
- 沈陽理工大學(xué)《微波技術(shù)與天線》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《內(nèi)燃機原理》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《機械制造裝備設(shè)計》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《高頻電子電路》2021-2022學(xué)年期末試卷
- 2023年清華附中小升初數(shù)學(xué)試題解析
- GB/T 7364-1987石蠟易碳化物試驗法
- 主體驗收施工單位發(fā)言稿
- 2023年聚合物材料表征測試題庫
- 碟式離心機圖片集
- 2020人文素養(yǎng)試題及答案
- 2023年四川天府銀行校園招聘筆試模擬試題及答案解析
- 鑄牢中華民族共同體意識學(xué)習(xí)PPT
- 酒店工程管理的意義
- 高血壓(英文版)-課件
- 冷庫安裝與維修4-1(冷庫的安全防護)課件
評論
0/150
提交評論