




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章Java中的異常處理機(jī)制0102038.1異常的含義及分類8.2異常處理8.3思考和練習(xí)(1)異常的含義所謂異常,就是程序運(yùn)行過程中出現(xiàn)的一些錯誤。當(dāng)然,這些錯誤不是程序的語法錯誤,異常與我們平時編寫程序出現(xiàn)的語法錯誤是兩碼事。例如,做除法時除數(shù)為零的情況,還比如打開一個不存在的文件或者數(shù)據(jù)庫。異常處理將會無形中改變程序的控制流程,目的是讓程序有機(jī)會來對出現(xiàn)的錯誤做出響應(yīng)。(2)異常的分類Java中異常是一個對象,繼承于Throwable這個類,所有的Throwable類的繼承類所產(chǎn)生的對象都是異常(有時也稱為例外)。從Throwable類派生出的異常類有Exception(異常)和Error(錯誤)。8.1異常的含義及分類3Throwable父類和Exception(異常)和Error(錯誤)的關(guān)系結(jié)構(gòu)如下:Throwable
//父類(下面兩個類相同的共性抽取出來的)
|--Error
|--Excption
//兩個子類(里面定義了很多問題(異常出現(xiàn)))
Error(錯誤):一般是指Java虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰、虛擬機(jī)出錯誤、動態(tài)鏈接失敗等,這種錯誤無法恢復(fù)或不可能捕獲,將導(dǎo)致應(yīng)用程序中斷,通常應(yīng)用程序無法處理這些錯誤,因此應(yīng)用程序不應(yīng)該捕獲Error對象,也無須在其throws子句中聲明該方法拋出任何Error或其子類。8.1異常的含義及分類Exception(異常):Exception
類及其子類是
Throwable
的一種形式,它指出了合理的應(yīng)用程序想要捕獲的條件:SQLException:該異常提供關(guān)于數(shù)據(jù)庫訪問錯誤或其他錯誤的信息。RuntimeException
:是那些可能在Java虛擬機(jī)正常運(yùn)行期間拋出的異常的超類。IOException:此類為異常的通用類,它是由失敗的或中斷的I/O操作生成的。8.1異常的含義及分類5Throwable():Throwable
類是Java語言中所有錯誤或異常的超類。只有當(dāng)對象是此類(或其子類之一)的實(shí)例時,才能通過Java虛擬機(jī)或者Java
throw
語句拋出。類似地,只有此類或其子類之一才可以是
catch
子句中的參數(shù)類型。異常對象包含的常用方法:getMessage():返回該異常的詳細(xì)描述字符printStackTrace():將該異常的跟蹤棧信息輸出到標(biāo)準(zhǔn)錯誤輸出。printStackTrace(PrintStreams):將該異常的跟蹤棧信息輸出
到指定的輸出流。getStackTrace():返回該異常的跟蹤棧信息。8.1異常的含義及分類(1)處理語句Java異常機(jī)制主要依賴于try、catch、finally、throw、throws五個關(guān)鍵字。try--catch結(jié)構(gòu)是異常處理最基本的結(jié)構(gòu)。在這種結(jié)構(gòu)中,可能引發(fā)的異常語句封裝在try程序體中,而處理異常的相應(yīng)語句封裝在catch程序體中。try--catch結(jié)構(gòu)格式如下:try{
需要被檢測的代碼;}catch{處理異常的代碼;(處理方式)}finally{一定會執(zhí)行的代碼;(處理方式)}8.2異常處理7try:它里面放置可能引發(fā)異常的代碼catch:后面對應(yīng)異常類型和一個代碼塊,用于表明該catch塊用于處理這種類型異常的代碼塊,可以有多個catch塊。finally:主要用于回收在try塊里打開的資源(如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件),異常機(jī)制總是保證finally塊總是被執(zhí)行。只有finally塊,執(zhí)行完成之后,才會回來執(zhí)行try或者catch塊中的return或者throw語句,如果finally中使用了return或者
throw等終止方法的語句,則就不會跳回執(zhí)行,直接停止。throw:用于拋出一個實(shí)際的異常,可以單獨(dú)作為語句使用,拋出一個具體的異常對象。throws:用在方法簽名中,用于聲明該方法可能拋出的異常。8.2異常處理(2)執(zhí)行步驟:如果執(zhí)行try塊中的業(yè)務(wù)邏輯代碼時出現(xiàn)異常,系統(tǒng)自動生成一個異常對象,該異常對象被提交給Java運(yùn)行環(huán)境,這個過程稱為拋出(throw)異常。當(dāng)Java運(yùn)行環(huán)境收到異常對象時,會尋找能處理該異常對象的catch塊,如果找到合適的cathc塊并把該異常對象交給catch塊處理,那這個過程稱為捕獲(catch)異常;如果Java運(yùn)行時環(huán)境找不到捕獲異常的catch塊,則運(yùn)行時環(huán)境終止,Java程序也將退出。不管程序代碼塊是否處于try塊中,甚至包括catch塊中代碼,只要執(zhí)行該代碼時出現(xiàn)了異常,系統(tǒng)都會自動生成一個異常對象,如果程序沒有為這段代碼定義任何catch塊,Java運(yùn)行環(huán)境肯定找不到處理該異常的catch塊,程序肯定在此退出。8.2異常處理9try塊后可以有多個catch塊。try塊后使用多個catch塊是為了針對不同異常類提供的不同的異常處理方式。當(dāng)系統(tǒng)發(fā)生不同意外情況時,系統(tǒng)會生成不同的異常對象,Java運(yùn)行時就會根據(jù)該異常對象所屬的異常類來決定使用哪個catch塊來處理該異常。通常情況下,如果try塊被執(zhí)行一次,則try塊后只有一個catch塊會被執(zhí)行,絕不可能有多個catch塊被執(zhí)行,除非在循環(huán)中使用continue開始下一次循環(huán),下一次循環(huán)又重新運(yùn)行了try塊,這才可能導(dǎo)致多個catch塊被執(zhí)行。進(jìn)行異常捕獲時,一定要記住先捕獲小的異常,再捕獲大的異常。8.2異常處理(3)出現(xiàn)異常示例例1,除數(shù)為0的程序異常classDemo{publicintdiv(intx,inty){returnx/y;}}publicclassc1{publicstaticvoidmain(String[]args){Demod=newDemo();intx=d.div(4,0);//0作為除數(shù)System.out.println("x="+x);System.out.println("over");}}8.2異常處理程序運(yùn)行結(jié)果:Exceptioninthread"main"java.lang.ArithmeticException:/byzero atDemo.div(c1.java:7) atc1.main(c1.java:13)8.2異常處理程序運(yùn)行結(jié)果:Exceptioninthread"main"java.lang.ArithmeticException:/byzero atDemo.div(c1.java:7) atc1.main(c1.java:13)從上面的結(jié)果可以分析出,在第7和第13行都出現(xiàn)了異常,這是因?yàn)槌ǖ臋C(jī)制,除數(shù)不能為0,這時候運(yùn)行就拋出了異常。怎么辦呢?就是采取異常處理。例如:8.2異常處理13classDemo{publicintdiv(intx,inty){returnx/y;}}publicclassc1{publicstaticvoidmain(String[]args){Demod=newDemo();try{intx=d.div(4,0);System.out.println("x="+x);}catch(Exceptione){System.out.println("除數(shù)有誤");}System.out.println("over"); }}程序運(yùn)行結(jié)果:除數(shù)有誤over8.2異常處理14例2,讀不存在的文件時出現(xiàn)異常,并進(jìn)行了異常處理。importjava.io.FileInputStream;importjava.io.IOException;publicclassc1{publicstaticvoidmain(String[]args){FileInputStreamfis=null;try{fis=newFileInputStream("a.txt");}catch(IOExceptionioe){System.out.println(ioe.getMessage());//return語句強(qiáng)制方法返回return;//使用exit來退出虛擬機(jī)//System.exit(1);}finally{//關(guān)閉磁盤文件,回收資源if(fis!=null){try{fis.close();}catch(IOExceptionioe){ioe.printStackTrace();}}System.out.println("程序已經(jīng)執(zhí)行了finally里德資源回收");}}}8.2異常處理程序運(yùn)行結(jié)果:a.txt(系統(tǒng)找不到指定的文件。)程序已經(jīng)執(zhí)行了finally里德資源回收8.2異常處理16(4)使用throws拋出異常使用throws拋出異常的思路是:當(dāng)前方法不知道如何處理這種類型的異常,該異常應(yīng)該由上一級調(diào)用者處理,如果main方法也不知道應(yīng)該如何處理這種類型的異常,也可以使用throws聲明拋出異常,該異常將交給JVM來處理。8.2異常處理importjava.io.FileInputStream;importjava.io.IOException;
publicclassc1{publicstaticvoidmain(String[]args)throwsIOException{test();}publicstaticvoidtest()throwsIOException{FileInputStreamfis=newFileInputStream("a.txt");}}8.2異常處理上面的程序也可以改為:importjava.io.FileInputStream;importjava.io.IOException;publicclassc1{publicstaticvoidtest()throwsIOException{FileInputStreamfis=newFileInputStream("a.txt");}publicstaticvoidmain(String[]args){try{test();}catch(IOExceptione){//TODOAuto-gene
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 前擲實(shí)心球教學(xué)課件
- 抽水蓄能電站建設(shè)與運(yùn)營安全管理
- 2025-2030中國陶瓷氧化鋁翻板行業(yè)發(fā)展前景及未來趨勢洞察報告
- 2025-2030中國鋼板倉工程行業(yè)需求前景及投資規(guī)模分析報告
- 交通安全知識培訓(xùn)材料課件
- 鄂州市涂家垴鎮(zhèn)中學(xué)春2026屆中考物理押題試卷含解析
- 山東濱州無棣縣市級名校2026屆中考物理仿真試卷含解析
- 交警輿情課件
- 故宮博物院教學(xué)課件
- 湖北省黃岡市紅安縣達(dá)標(biāo)名校2026屆中考二模英語試題含答案
- SLT278-2020水利水電工程水文計(jì)算規(guī)范
- 玻纖板加工工藝
- 教學(xué)勇氣漫步教師心靈
- 2023年山省西學(xué)中結(jié)業(yè)綜合考試題庫10-891-30
- 教練員聘用合同模板
- 性能設(shè)計(jì)(朱炳寅老師講座課件)
- 浙江省園林綠化工程施工質(zhì)量驗(yàn)收規(guī)范
- 雅思海外閱讀8套真題(含答案解析)
- 婚前醫(yī)學(xué)檢查證明(含存根)
- GB 24542-2009墜落防護(hù)帶剛性導(dǎo)軌的自鎖器
- 《建設(shè)項(xiàng)目竣工環(huán)境保護(hù)驗(yàn)收技術(shù)指南污染影響類》
評論
0/150
提交評論