版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第九章 異常處理,通過(guò)本章的學(xué)習(xí),主要掌握以下知識(shí)點(diǎn): 異常處理的機(jī)制 捕獲與處理異常 多異常處理 拋出異常 自定義異常類 本章的重點(diǎn): 異常處理的機(jī)制 捕獲與處理異常 本章的難點(diǎn): 自定義異常類,1、java異常的概念:,異常exception:程序中出現(xiàn)的問(wèn)題或不常見(jiàn)的情形。 異常由程序或者運(yùn)行時(shí)環(huán)境拋出,并能被捕獲,需要的話可以進(jìn)行適當(dāng)?shù)奶幚怼?可能導(dǎo)致異常的原因,試圖被0除;,數(shù)組下標(biāo)越界;,沒(méi)有找到指定的文件;,請(qǐng)求的I/O操作沒(méi)有正常的執(zhí)行;,試圖訪問(wèn)空引用所指的對(duì)象;,試圖執(zhí)行一個(gè)違反某類安全措施的操作; ,9.1 異常處理的基本概念,9.1.1 錯(cuò)誤和異常 按照錯(cuò)誤的性質(zhì)可將程
2、序錯(cuò)誤分為語(yǔ)法錯(cuò)、語(yǔ)義錯(cuò)、邏輯錯(cuò)。,在Java中的編譯錯(cuò)誤是由于編寫的程序代碼中存在著語(yǔ)法錯(cuò)誤,而未能通過(guò)由源代碼到字節(jié)碼的編譯過(guò)程而產(chǎn)生的錯(cuò)誤。語(yǔ)法錯(cuò)誤是由語(yǔ)言的編譯系統(tǒng)負(fù)責(zé)檢測(cè)和報(bào)告。沒(méi)有編譯錯(cuò)誤是一個(gè)程序能正常運(yùn)行的基本條件,只要沒(méi)有編譯錯(cuò)誤,Java的源代碼才能被編譯成字節(jié)碼。,運(yùn)行錯(cuò)誤是程序運(yùn)行過(guò)程中產(chǎn)生的錯(cuò)誤,根據(jù)性質(zhì)的不同,運(yùn)行錯(cuò)誤又分為系統(tǒng)運(yùn)行錯(cuò)誤和邏輯運(yùn)行錯(cuò)誤。 系統(tǒng)運(yùn)行錯(cuò)誤簡(jiǎn)稱為錯(cuò)誤,是指程序在執(zhí)行過(guò)程中所產(chǎn)生對(duì)操作系統(tǒng)的損害。 邏輯運(yùn)行錯(cuò)誤是指程序不能實(shí)現(xiàn)程序員的設(shè)計(jì)意圖和設(shè)計(jì)功能而產(chǎn)生的錯(cuò)誤,這種錯(cuò)誤也被稱為異常。,異 常,異常:指程序在運(yùn)行過(guò)程中發(fā)生了由于算法考慮不周
3、或軟件設(shè)計(jì)錯(cuò)誤等導(dǎo)致的程序異常事件。 錯(cuò)誤:指程序在執(zhí)行過(guò)程中所遇到的硬件或操作系統(tǒng)的錯(cuò)誤。,異常例子,public class HelloWorld public static void main (String args) int i = 0; String greetings = Hello world!, No, I mean it!, HELLO WORLD! ; while (i 4) System. out. println (greetings i); i+; ,public class ExceptionDemo public static void main(String
4、args) int i = 0; System.out.println(5/i); ,Java語(yǔ)言的異常處理機(jī)制,1)拋出異常:在堆棧中創(chuàng)建一個(gè)異常對(duì)象。 當(dāng)方法中有一個(gè)錯(cuò)誤發(fā)生后,該方法創(chuàng)建一個(gè)異常對(duì)象并把它交給運(yùn)行系統(tǒng)。異常對(duì)象中包含了有關(guān)異常的信息,如異常類型、發(fā)生錯(cuò)誤時(shí)的程序狀態(tài)等。 2)捕獲異常:找到異常處理程序。 運(yùn)行時(shí)系統(tǒng)在方法調(diào)用堆棧里為被拋出的異常查找處理代碼。運(yùn)行系統(tǒng)從發(fā)生錯(cuò)誤的方法開(kāi)始進(jìn)行回朔,在方法調(diào)用堆棧里向后搜索,直到找到能處理當(dāng)前發(fā)生的異常的處理程序的方法。 3)處理異常。 通過(guò)方法調(diào)用來(lái)處理異常。 4)終止或恢復(fù)運(yùn)行。 如果運(yùn)行時(shí)系統(tǒng)在方法調(diào)用棧查遍了所有的方法
5、(主方法中)而未找到合適的異常處理程序,則運(yùn)行時(shí)系統(tǒng)終止執(zhí)行。,9.2異常處理類,所有異常類型都是 Throwable的子類,用戶程序可能 捕獲的異常,也是用來(lái)創(chuàng)建用戶異常類型子類的基類。,用于顯示與Java運(yùn)行時(shí)系統(tǒng)本身有關(guān)的錯(cuò)誤,Error類對(duì)象由Java虛擬機(jī)生成并拋出; Exception類對(duì)象由應(yīng)用程序處理或拋出。,運(yùn)行時(shí)異常,是程序運(yùn)行時(shí)自動(dòng)對(duì)某些錯(cuò)誤做出反應(yīng)而產(chǎn)生的,1、Throwable類是所有異常類型的父類,不能被直接使用,表示任何可以作為異常被拋出的類。 2、Error用來(lái)表示編譯時(shí)和系統(tǒng)錯(cuò)誤,表示恢復(fù)不是不可能但很困難情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出,它不可能執(zhí)行程序
6、處理這樣的問(wèn)題,一般是和VM有關(guān)的問(wèn)題。,異常類及其子類-2,3、Exception是可以被拋出的基本異常類型,在JAVA類庫(kù)、用戶方法以及運(yùn)行時(shí)故障中都可能拋出Exception型異常。 RuntimeException 運(yùn)行時(shí)異常。它表示程序運(yùn)行正常的話就不會(huì)發(fā)生這種問(wèn)題,這種異常不用在程序中把他們列出來(lái),運(yùn)行時(shí)有問(wèn)題,會(huì)自動(dòng)被JVM拋出。比如空指針異常,數(shù)組超出異常。 除了運(yùn)行時(shí)例外之外的其他由Exception 繼承來(lái)的例外類都是非運(yùn)行時(shí)的例外,例如FileNotFoundException(文件未找到例外)。Java編譯器要求在程序中必須處理這種例外,捕獲例外或者聲明拋棄例外。,Th
7、rowable類的常用方法 public String getMessage() 返回異常的原因 getStackTrace() 返回堆棧跟蹤情況 public void printStackTrace() 打印堆棧的標(biāo)準(zhǔn)錯(cuò)誤流 printStackTrace(PrintStreams) 打印堆棧的標(biāo)準(zhǔn)打印流 public String toString() 返回簡(jiǎn)單描述 .,9.3 捕獲與處理異常,在Java語(yǔ)言中,異常處理是通過(guò)try、catch、finally、throw、throws五個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的。,當(dāng)一個(gè)異常類的對(duì)象被捕獲或接收后,用戶程序就會(huì)發(fā)生流程跳轉(zhuǎn),系統(tǒng)終止當(dāng)前的流程而跳
8、轉(zhuǎn)到專門的異常處理語(yǔ)句塊,或直接跳出當(dāng)前程序和java虛擬機(jī)回到操作系統(tǒng)。,2020/8/2,16,在Java的異常處理機(jī)制中,提供了try-catch-finally語(yǔ)句來(lái)捕獲和處理一個(gè)或多個(gè)異常,其語(yǔ)法格式如下:,try catch (異常類名 形參對(duì)象名) finally ,由try所限定的代碼塊中的語(yǔ)句在執(zhí)行過(guò)程中可能會(huì)生成例外對(duì)象并拋棄。,1、catch必須緊跟在try之后 2、可有多個(gè)catch塊,但異常類型必須是層層嵌套的,即先從子類異常,最后才到父類異常。 3、當(dāng)拋出異常時(shí),異常處理機(jī)制將負(fù)責(zé)搜索參數(shù)與異常類型相匹配的第一個(gè)處理程序。 4、只有匹配的catch子句能執(zhí)行,和sw
9、itch不同,不需要break. 5、可通過(guò)throwable類提供的方法getMessage(),printStackTrace( ) 來(lái)跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。,為異常處理提供一個(gè)統(tǒng)一的出口或定義跳轉(zhuǎn)流程,多異常處理 try . catch(ExceptionName1 e1 ) . catch(ExceptionName2 e2 ) . catch(ExceptionNameN eN ) . finally . ,import java.io.*; public class test92 public static void main(String args) FileRead
10、er fr; try fr=new FileReader(d:a.txt); catch(Exception e) e.printStackTrace(); finally if(fr!=null) try fr.close(); catch(Exception e) e.printStackTrace(); ,public class app9_2 public static void main(String args) int i; int a=1,2,3,4; for(i=0;i5;i+) try System.out.print(a+i+/+i+=+(ai/i); catch(Arra
11、yIndexOutOfBoundsException e) System.out.print(捕獲了數(shù)組下標(biāo)越界異常); catch(ArithmeticException e) System.out.print(異常類名稱是:+e); catch(Exception e) System.out.print(捕獲+e.getMessage()+異常!); finally System.out.println( finally i=+i); System.out.println(繼續(xù)!); ,public class test91 public static void main(String a
12、rgs) int a=1,2,3,4; int x=0; try x=10/x;/public class test91 public static void main(String args) int a=1,2,3,4; int x=0; try x=10/x; System.out.println(a4); catch(Exception e) System.out.println(e.getMessage(); e.printStackTrace(); finally System.out.println(finally i=+x); 遇到異常,停止執(zhí)行try后面的語(yǔ)句 System.
13、out.println(a4); catch(Exception e) System.out.println(e.getMessage(); e.printStackTrace(); finally System.out.println(finally i=+x); ,注意:,異常捕獲的過(guò)程中做了兩個(gè)判斷,一是try程序塊中是否有異常產(chǎn)生,第二個(gè)是產(chǎn)生的異常是否和catch后面括號(hào)內(nèi)捕獲的異常匹配。 catch塊中的語(yǔ)句應(yīng)根據(jù)異常的不同而執(zhí)行不同的操作,比較通用的做法是輸出異常和錯(cuò)誤的相關(guān)信息,包括異常名稱、產(chǎn)生異常的方法名等。 處理多異常是應(yīng)注意catch塊的排列順序,將處理較具體、較常見(jiàn)的
14、異常catch塊應(yīng)放在前面,而可以與多種異常相比配的catch塊應(yīng)放在較后的位置。,4、finally語(yǔ)句塊用來(lái)為異常處理提供一個(gè)統(tǒng)一的出口,finally通常用于對(duì)一些資源做清理工作,如關(guān)閉打開(kāi)的文件。 5、finally塊可以省略。 6、當(dāng)catch塊中包含System.exit(0)時(shí),不執(zhí)行finally語(yǔ)句塊。,9.4 拋出異常,拋出異常的方法: (1)系統(tǒng)自動(dòng)拋出異常。 (2)使用throw語(yǔ)句拋出異常,用戶程序自定義的異常,必須借助于throw語(yǔ)句來(lái)定義何種情況下產(chǎn)生了此種異常對(duì)應(yīng)的錯(cuò)誤。(手動(dòng)拋出異常) 格式:throw 由異常類所產(chǎn)生的對(duì)象 throw new ArriayI
15、ndexOutOfBoundException();,但是有時(shí)候有些錯(cuò)誤在jvm看來(lái)不是錯(cuò)誤,比如說(shuō) int age = 0; age = -100; System.out.println(age); 需要自己手動(dòng)引發(fā)異常,這就是throw的作用。 int age = 0; age = -100; if(age0) Exception e = new Exception(“throw exception”);/創(chuàng)建異常對(duì)象 throw e;/拋出異常 /throw new Exception(“throw exception”); System.out.println(age);,public
16、 class app9_4 public void run(byte k) byte y=1,i; System.out.print(k+!=); for(i=1;iByte.MAX_VALUE/i) throw new Exception(溢出!); else y=(byte)(y*i); catch(Exception e) System.out.println(異常:+e.getMessage(); e.printStackTrace(); System.exit(0); System.out.println(y); public static void main(String args
17、) app9_4 a=new app9_4(); for(byte i=1;i10;i+) a.run(i); ,例題:,從鍵盤輸入一字符串,當(dāng)字符串中包含”T”或”t”時(shí),拋出一個(gè)算術(shù)異常,處理方式為打印出錯(cuò)信息.,import java.util.*; public class testexception public static void main(String args) Scanner reader=new Scanner(System.in); String input; char c; System.out.println(請(qǐng)輸入字符串); try input=reader.n
18、ext(); for(int i=0;iinput.length();i+) c=input.charAt(i); if(c=T|c=t) throw new ArithmeticException(); else System.out.print(c); catch(ArithmeticException e) e.printStackTrace(); ,拋出異常的方法,如果在一個(gè)方法內(nèi)部的語(yǔ)句執(zhí)行時(shí)可能引發(fā)某種異常,但是并不確定如何處理,則此方法應(yīng)拋出異常,表明該方法將不對(duì)這些異常進(jìn)行處理,而由該方法的調(diào)用者負(fù)責(zé)處理。 在程序中的異常沒(méi)有用trycatch語(yǔ)句捕獲異常和處理異常的代碼,則可
19、以在程序代碼所在的方法聲明的后面用throws關(guān)鍵字聲明該方法要拋出異常。,拋出異常的方法,格式: 修飾符 返回值類型 方法名(參數(shù)列表) throws 異常類列表 “異常類列表”是方法中要拋出的異常類,當(dāng)異常類多于一個(gè)時(shí)用“,”隔開(kāi)。 當(dāng)一個(gè)方法拋出異常后,系統(tǒng)將異常向上傳遞,由調(diào)用它的方法來(lái)處理這些異常。,public class app9_6 public static void check(String str1) char ch; for(int i=0;istr1.length();i+) ch=str1.charAt(i); if(!Character.isDigit(ch) t
20、hrow new NumberFormatException(); ,public static void main(String args) int num; try check(args0); num=Integer.parseInt(args0); if(num60) System.out.println(成績(jī)?yōu)椋?num+ 及格); else System.out.println(成績(jī)?yōu)椋?num+ 不及格); catch(NumberFormatException e) System.out.println(輸入的參數(shù)不是數(shù)值類型); catch(Exception e) Syste
21、m.out.println(命令行中沒(méi)有提供參數(shù)); ,若方法內(nèi)有使用throw拋出異常的語(yǔ)句或有用trycatch處理異常的語(yǔ)句,則在定義方法的頭部可不用throws子句拋出與其相對(duì)應(yīng)的異常。,IOException類的異常處理 直接由主方法main( )拋出異常,在main( )后加throws IOException子句。 在程序代碼內(nèi)編寫try-catch塊來(lái)捕獲由系統(tǒng)拋出的異常。 在main( )后加throws IOException子句拋出異常,也可以在程序中try-catch塊來(lái)捕獲由系統(tǒng)拋出的異常。,import java.io.*; public class app9_7
22、public static void main(String args) String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); while(true) try System.out.print(請(qǐng)輸入字符串:); str=buf.readLine(); if(str.length()0) break; else throw new IOException(); catch(IOException e) System.out.println(必須輸入字符串!); conti
23、nue; String s=str.toUpperCase(); System.out.println(轉(zhuǎn)換后的字符串為:+s); ,自定義異常類,聲明一個(gè)新的異常類,該異常類必須從Java已有定義的異常類繼承,如Exception、IOException等。 為新的異常類定義屬性和方法,或重載父類的屬性和方法,使這些屬性和方法能夠體現(xiàn)該類所對(duì)應(yīng)的錯(cuò)誤的信息。,例子:DefineExceptionDemo.java,自定義異常類例子,public class MyException extends Exception private int x; public MyException( ) p
24、ublic MyException( String msg) super(msg); public MyException( String msg , int x ) super(msg); this.x = x; public int val() return x ; public String getMessage() return Detail Message : +x+ +super.getMessage(); ,例子:ExtraFeatures.java,習(xí)題,關(guān)于垃圾收集機(jī)制的敘述正確的是( )。 A垃圾收集將檢查并釋放不再使用的內(nèi)存 B程序開(kāi)發(fā)者必須自己創(chuàng)建一個(gè)線程進(jìn)行內(nèi)存釋放的工作 C垃圾收集允許程序開(kāi)發(fā)者明確指定并立即釋放該內(nèi)存 D垃圾收集能夠在期望的時(shí)間釋放被java對(duì)象使用的內(nèi)存,下列哪些語(yǔ)句關(guān)于Java內(nèi)存回收的說(shuō)明是正確的? ( ) A、程序員必須創(chuàng)建一個(gè)線程來(lái)釋放內(nèi)存 B、內(nèi)存回收程序負(fù)責(zé)釋放無(wú)用內(nèi)存 C、內(nèi)存回收程序允許程序
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:精神生活共同富裕視域下紅色文化旅游深度融合的響應(yīng)機(jī)制與路徑研究
- 課題申報(bào)參考:教育治理現(xiàn)代化背景下現(xiàn)代產(chǎn)業(yè)學(xué)院內(nèi)部治理結(jié)構(gòu)的優(yōu)化研究
- 2025年c語(yǔ)言實(shí)習(xí)心得體會(huì)模版(4篇)
- 2025版房地產(chǎn)尾款支付及產(chǎn)權(quán)過(guò)戶協(xié)議3篇
- 二零二五年車輛抵押維修保養(yǎng)合同3篇
- 二零二五版貿(mào)促會(huì)棉花期貨交易專區(qū)棉花現(xiàn)貨買賣合同3篇
- 二零二五年度企業(yè)法律風(fēng)險(xiǎn)防控培訓(xùn)合同3篇
- 主體架構(gòu)工程分包合同(2024年度)一
- 專屬分店管理承包協(xié)議模板版A版
- 二零二五年度多人合伙經(jīng)營(yíng)酒吧合作協(xié)議范本3篇
- 《健康體檢知識(shí)》課件
- 生產(chǎn)計(jì)劃主管述職報(bào)告
- 名表買賣合同協(xié)議書(shū)
- JTG-T-F20-2015公路路面基層施工技術(shù)細(xì)則
- 2024年遼寧石化職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)附答案
- 中西方校服文化差異研究
- 《子宮肉瘤》課件
- 《準(zhǔn)媽媽衣食住行》課件
- 給男友的道歉信10000字(十二篇)
- 客人在酒店受傷免責(zé)承諾書(shū)范本
- 練字本方格模板
評(píng)論
0/150
提交評(píng)論