版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第七章異常處理
Java程序設(shè)計(jì)本章主要內(nèi)容
異常的概念處理異常自定義異常小結(jié)2024/12/24李飛——計(jì)算中心2/22異常的概念凡是在運(yùn)行時(shí)進(jìn)入的不正常狀態(tài)都稱為錯(cuò)誤。這些錯(cuò)誤根據(jù)錯(cuò)誤的嚴(yán)重性可以分為兩類:一類是致命性的錯(cuò)誤,它們的出現(xiàn)可能會(huì)導(dǎo)致系統(tǒng)崩潰,并且程序員并不能編寫程序解決所出現(xiàn)的問題;另一類是普通級(jí)的錯(cuò)誤,這類錯(cuò)誤如果不加控制就會(huì)使程序非正常中斷,但如果編寫代碼來處理的話,就有可能避免中斷程序的執(zhí)行。這類錯(cuò)誤就為異常(Exception),就是指程序中出現(xiàn)的問題或不常見的情形。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心3/22程序中錯(cuò)誤的類型語法錯(cuò)誤語法錯(cuò)誤是由于程序員編寫的代碼存在語法問題,導(dǎo)致源代碼在編譯成為字節(jié)碼過程中產(chǎn)生的錯(cuò),它由Java語言的編譯系統(tǒng)負(fù)責(zé)監(jiān)測(cè)和報(bào)告。運(yùn)行錯(cuò)誤運(yùn)行錯(cuò)誤是在程序執(zhí)行過程中產(chǎn)生的錯(cuò)誤,只有在程序運(yùn)行時(shí)才能發(fā)現(xiàn)。這類錯(cuò)誤如被0除,數(shù)組下標(biāo)越界,聲明了變量或?qū)ο笠脜s不使用等。邏輯錯(cuò)誤由于循環(huán)條件或選擇條件沒有寫正確導(dǎo)致的錯(cuò)誤或由于涉及的程序邏輯有問題而導(dǎo)致的錯(cuò)誤。對(duì)于這類錯(cuò)誤,Java語言的編譯系統(tǒng)無法處理,Java也沒有相應(yīng)的處理措施。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心4/22JDK中異常類的結(jié)構(gòu)
2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心5/22Exception類
在Java中,有些異常是Java編譯器要求必須處理的,JDK把這些異常的特征和一些通用的處理方法定義成了Exception類及其子類。當(dāng)程序編譯過程中一旦檢測(cè)出有可能發(fā)生這些異常情況,Java的編譯系統(tǒng)會(huì)自動(dòng)生成相應(yīng)的異常類的實(shí)例對(duì)象,并要求應(yīng)用程序來處理,如果應(yīng)用程序中沒有它們的處理程序,系統(tǒng)則編譯失敗并報(bào)告異常產(chǎn)生的信息。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心6/22常見的Exception類的子類子類名說明AWTException圖形界面組件異常。ClassNotFoundException指定類或接口不存在異常。DataFormatException數(shù)據(jù)格式異常。FontFormatException字體格式異常。IllegalAccessException非法訪問異常,如試圖訪問非公有方法。InstantiationException實(shí)例化異常,如實(shí)例化抽象類。InterruptedException中斷異常。IOException輸入輸出異常。NoSuchFieldException找不到指定的字段異常。NoSuchMethodException找不到指定方法異常。PrintException打印機(jī)錯(cuò)誤報(bào)告異常。RuntimeException運(yùn)行時(shí)異常。SQLExceptionSQL語句執(zhí)行錯(cuò)誤異常。TimeoutException線程阻塞超時(shí)異常。TransformException執(zhí)行轉(zhuǎn)換算法異常。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心7/22常見的RuntimeException類的子類子類名說明ArithmeticException除數(shù)為0異常。ArrayIndexOutOfBoundsException訪問數(shù)組下標(biāo)越界異常。CalssCaseException類強(qiáng)制轉(zhuǎn)換異常。IllegealArgumentException非法參數(shù)異常。IllegalStateException非法或不適當(dāng)?shù)臅r(shí)間調(diào)用方法異常。IndexOutOfBoundsException下標(biāo)越界異常。MissingResourceException找不到資源異常。NagativeArraySizeException數(shù)組長度為負(fù)數(shù)異常。NullPointerException空指針異常。NumberFormatException數(shù)值格式異常。ArrayStoreException由于數(shù)組空間不夠引起的數(shù)組存儲(chǔ)異常。EventException事件異常,如果事件的類型不是在調(diào)用該方法之前通過初始化該事件指定的事件時(shí)拋出。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心8/227.2處理異常
在Java中異常被定義為一類對(duì)象。當(dāng)執(zhí)行程序中的方法發(fā)生錯(cuò)誤時(shí),Java會(huì)根據(jù)錯(cuò)誤的類型創(chuàng)建一個(gè)異常對(duì)象并交給運(yùn)行時(shí)系統(tǒng)。拋出異常:我們把創(chuàng)建異常對(duì)象并將它交給運(yùn)行時(shí)系統(tǒng)的過程稱為拋出異常。捕獲異常:我們把選擇合適的異常處理方法并將異常傳遞給它的過程稱為異常的捕獲異常處理:把執(zhí)行異常處理程序的過程叫異常的處理。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心9/22異常處理的語句try{
可能產(chǎn)生異常的語句;}catch(要捕獲的異常類名異常對(duì)象名){
異常處理程序;}……finally{
一定會(huì)運(yùn)行的程序;}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心10/221.try程序塊中在運(yùn)行時(shí)產(chǎn)生異常時(shí),程序運(yùn)行中斷,并拋出相應(yīng)的異常對(duì)象。2.拋出的異常對(duì)象如果屬于catch括號(hào)中要捕獲的異常類,則catch會(huì)捕獲此異常,且為該異常創(chuàng)建一個(gè)引用名,然后執(zhí)行catch程序塊中的異常處理程序。其中“……”表示多個(gè)catch程序塊,每個(gè)catch程序塊捕獲一種異常。3.無論try程序塊是否捕獲到異常,或者捕獲到的異常是否與catch()括號(hào)內(nèi)的異常類型相同,最后一定會(huì)運(yùn)行finally塊里的程序代碼。4.finally塊運(yùn)行結(jié)束后,程序繼續(xù)運(yùn)行try-catch-finally塊后面的代碼。例7.1:異常處理舉例importjava.util.Scanner;publicclasseg7_1{ publicstaticvoidmain(String[]args){ inta=0,b,c=0; Scanners=newScanner(System.in); try{ a=9; b=s.nextInt(); c=a/b; }catch(ArithmeticExceptione){ System.out.println("請(qǐng)輸入非0值"); b=1; c=a/b; } System.out.println("你好,異常處理完畢!"); System.out.println(c); }}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心11/22異常捕獲策略盡可能只捕獲指定的異常,而不是捕獲多個(gè)異常的公共父類,除非確信這個(gè)異常的所有子類對(duì)程序來說是沒有差別的,可以同樣的方式來處理它們,同時(shí)也要考慮該異常將來可能的擴(kuò)展。只要有可能,就不要捕獲java.lang.Exception或java.lang.Throwable。如果有多個(gè)指定的異常需要處理,可以多寫幾個(gè)catch代碼塊,或者捕獲多個(gè)異常的公共父類,只要不是java.lang.Exception或java.lang.Throwable就行。一般情況下不要捕獲RuntimeException或Error,除非這些異常并不代表程序或系統(tǒng)的錯(cuò)誤。讓這些標(biāo)志著程序或系統(tǒng)的異常沿著調(diào)用棧,一直傳遞到最上層的嚴(yán)重錯(cuò)誤處理程序中。重構(gòu)代碼時(shí),仔細(xì)觀察因?yàn)榇a的改變而變得多余的catch代碼塊。因?yàn)榫幾g器并不是總能發(fā)現(xiàn)這類問題。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心12/22異常的拋出在Java中,一旦軟件運(yùn)行過程出現(xiàn)異常,我們有三種方法來處理它。在發(fā)生異常的同時(shí),通過try-catch-finally語句直接處理,這種處理方法被稱為程序內(nèi)部處理;另一種是程序員不對(duì)方法程序中產(chǎn)生的異常編寫處理程序,僅僅在可能出現(xiàn)異常的方法的方法聲明部分添加一個(gè)拋出異常的關(guān)鍵字說明這些異常由系統(tǒng)來處理。還有一種是結(jié)合系統(tǒng)處理和程序員編程兩種方式處理異常。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心13/22異常的拋出throws子句要想把方法運(yùn)行過程中的異常拋出給系統(tǒng),需要在方法聲明中添加throws子句。其方法聲明的具體格式如下。一般的,如果一個(gè)方法引發(fā)了一個(gè)異常,而它自己又不處理,就要由其調(diào)用方法進(jìn)行處理。在子類中一個(gè)重寫的方法可能只拋出父類中聲明過的異常或其子類。如果一個(gè)方法有完全相同的名稱和參數(shù),它只能拋出父類中聲明過得異常或者異常的子類。Eg7.32024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心14/22訪問權(quán)限修飾符
返回值類型
方法名(參數(shù)列表)throws異常列表異常的拋出用throw保留字主動(dòng)拋出異常Java是通過異常拋出語句來實(shí)現(xiàn)主動(dòng)拋出異常功能的。其語句格式是throw異常對(duì)象;Eg7.42024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心15/22在使用throw語句拋出異常時(shí)需要注意的問題Throwable類的子類所創(chuàng)建的實(shí)例對(duì)象都可以用throw語句拋出。出異常是為了表明程序遇到錯(cuò)誤無法正常執(zhí)行而需要異常處理。拋出異常的throw語句可以在try代碼段中,也可以在try代碼段中調(diào)用的方法中拋出異常。異常拋出后,它后面的代碼將不再執(zhí)行,也可以說異常地拋出終止了代碼段的正常執(zhí)行。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心16/22異常拋出策略從方法使用者的角度,而不是書寫該方法的開發(fā)者角度來考慮,聲明對(duì)使用者有意義的異常。
何時(shí)拋出異?!谒O(shè)計(jì)的方法遇到不能處理的非正常情形下,應(yīng)當(dāng)聲明拋出異常。
不聲明所有可能發(fā)生的異常,要盡可能的將“低級(jí)異常”映射成對(duì)使用者有意義的高級(jí)異常。不要聲明拋出“Exception”或“Throwable”,因?yàn)槁暶鲯伋觥俺?jí)異?!睂?duì)方法使用者來說是毫無用處的,而且會(huì)導(dǎo)致極差的代碼風(fēng)格。一般不聲明拋出超過3個(gè)的異常,如果發(fā)生這種情況,也要通過代碼重構(gòu)或?qū)⒍鄠€(gè)異常映射到一個(gè)通用異常中來解決該問題,或者在方法內(nèi)部自行消化部分內(nèi)部異常。將異常組織成一個(gè)對(duì)象樹結(jié)構(gòu),有利于保持方法定義的穩(wěn)定性,同時(shí)也給方法的使用者提供了以不同粒度處理異常的自由。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心17/227.3自定義異常
我們可以通過從Exception類或者它的子類派生一個(gè)子類,作為我們自定義的異常類。
在程序運(yùn)行時(shí),發(fā)生了類似的問題時(shí),程序員可以通過throw語句拋出自定義的異常類的實(shí)例,將其放到異常處理的隊(duì)列中,并激活Java的異常處理機(jī)制。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心18/22例7.5自定義異常描述不可以輸入負(fù)數(shù)成績。importjava.util.Scanner;classmyExceptionextendsException{ publicmyException(Stringmsg){ super(msg); }}publicclasseg7_5{ publicstaticvoidmain(String[]args){ doublea;2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心19/22try{ a=inputScore(); System.out.println(a); }catch(myExceptione){ System.out.println(e.getMessage()); } System.out.println("程序結(jié)束"); } staticdoubleinputScore()throwsmyException{ doublescore=0; Scanners=newScanner(System.in); System.out.println("請(qǐng)輸入學(xué)生成績!");score=s.nextDouble(); if(score<0){ thrownewmyException("不能傳小于0的數(shù)"); } returnscore; }}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心20/22小結(jié)異常處理機(jī)制包括:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 青春創(chuàng)造社團(tuán)打造創(chuàng)新思維計(jì)劃
- 《動(dòng)脈總論各論》課件
- 《宗苗答辯》課件
- 2022年黑龍江省雙鴨山市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2021年陜西省榆林市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2022年廣西壯族自治區(qū)賀州市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 實(shí)證護(hù)理讀書報(bào)告撰寫格式
- 江西省九江市(2024年-2025年小學(xué)六年級(jí)語文)部編版小升初真題(上學(xué)期)試卷及答案
- 2024年藥用粉碎機(jī)械項(xiàng)目資金申請(qǐng)報(bào)告
- 2024年化學(xué)陶瓷化學(xué)品項(xiàng)目投資申請(qǐng)報(bào)告代可行性研究報(bào)告
- 2024年生開心果市場(chǎng)需求分析報(bào)告
- 修理廠環(huán)保規(guī)定匯總
- 現(xiàn)代材料分析測(cè)試技術(shù)課件
- 2024年其他招錄考試-大學(xué)畢業(yè)生士兵提干筆試歷年真題薈萃含答案
- 北魏政治和北方民族大交融【全國一等獎(jiǎng)】
- 淮安市2023-2024學(xué)年七年級(jí)上學(xué)期期末歷史試卷(含答案解析)
- 培養(yǎng)學(xué)生深度思考的能力
- 【瑞幸咖啡財(cái)務(wù)分析報(bào)告(附財(cái)務(wù)報(bào)表)5300字(論文)】
- 過敏性鼻炎-疾病研究白皮書
- 烏頭堿中毒急診科培訓(xùn)課件-
- 三軸水泥攪拌樁施工質(zhì)量措施
評(píng)論
0/150
提交評(píng)論