版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第5章 異常處理,5.1 異常處理基礎(chǔ) 5.2 異常處理措施,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),1,2,目標(biāo),理解異常的概念 運(yùn)用 try 塊、catch 塊和 finally 塊處理異常 運(yùn)用多重 catch 塊處理異常 運(yùn)用關(guān)鍵字 throw 處理異常 運(yùn)用JAVA編寫和使用自定義異常,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),5.1 異常處理基礎(chǔ),5.1.1 異常處理機(jī)制的必要性 5.1.2 錯誤和異常,3,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),5.1.1 異常處理機(jī)制的必要性,面向過程語言錯誤處理方式的缺陷 不進(jìn)行范圍檢查 采用if
2、語句進(jìn)行事先判斷以防止出現(xiàn)錯誤。 面向?qū)ο笳Z言異常處理的思想 將程序正常代碼與錯誤處理代碼分開。 使程序具有處理錯誤的能力。,4,1. 異常不可避免,不要指望你的程序永遠(yuǎn)不會出錯 Java程序運(yùn)行過程中的異常事件可分為兩類: 錯誤(Error):JVM系統(tǒng)內(nèi)部錯誤、資源耗盡等嚴(yán)重情況 異常(Exception): 其它因編程錯誤或偶然的外在因素導(dǎo)致的一般性問題,例如: 對負(fù)數(shù)開平方根 空指針訪問 試圖讀取不存在的文件 網(wǎng)絡(luò)連接中斷,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),2. Java語言是安全的,Java語言提供嚴(yán)密的語法規(guī)則。 Java在編譯和運(yùn)行時嚴(yán)格檢查錯誤。 Java
3、提供異常處理機(jī)制。 Java提供內(nèi)存自動管理方式。,6,7,3. 理解異常的概念-什么是異常?,public class ExceptionRaised public ExceptionRaised() public int calculate( int operand1, int operand2) int result = operand1 / operand2; return result; public static void main(String args) ExceptionRaised obj = new ExceptionRaised(); int result = obj.
4、calculate(9, 0); System.out.println(result); ,異常情況,異 常,程序突然終止并將控制交給操作系統(tǒng),在運(yùn)行時發(fā)生的錯誤,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),5.1.2 錯誤和異常,錯誤(error)指程序運(yùn)行時遇到的硬件或操作系統(tǒng)的錯誤。 Error錯誤類 異常(exception)指在硬件和操作系統(tǒng)正常時,程序遇到的運(yùn)行錯。 Exception異常類,8,1. 錯誤例子,public class RaiseError public static void call(int i) System.out.println(i = +
5、i); call(i+1); public static void main(String args) call(1); ,Exception in thread main java.lang.StackOverflowError at chapter05.RaiseError.call(RaiseError.java:7) at chapter05.RaiseError.call(RaiseError.java:7),public class RaiseException public static void main(String args) java.util.Date d = null
6、; System.out.println(d.getTime(); System.out.println(calclate(10,0); private static double calclate(int i, int j) return i/j; ,2. 異常例子,Exception in thread main java.lang.NullPointerException at chapter05.RaiseException.main(RaiseException.java:6),3. Error/Exception層次圖,12,4. Java異常類,文件結(jié)束,EOFException
7、,找不到文件,FileNotFoundException,I/O 異常的根類,IOException,數(shù)字轉(zhuǎn)化格式異常,比如字符串到 float 型數(shù)字的轉(zhuǎn)換無效,NumberFormatException,不能加載所需的類,ClassNotFoundException,方法接收到非法參數(shù),IllegalArgumentException,數(shù)組大小小于或大于實(shí)際的數(shù)組大小,ArrayIndexOutOfBoundException,嘗試訪問 null 對象成員,NullPointerException,許多 java.lang 異常的基類,RuntimeException,異常層次結(jié)構(gòu)的根類,
8、Exception,算術(shù)錯誤情形,如以零作除數(shù),ArithmeticException,線程中斷,InterruptedException,說 明,異 常,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),5. 異常類定義,public class Throwable implements Serializable public Throwable() public Throwable(String message) public String getMessage() /獲得異常信息 public String toString() /獲得異常對象的描述信息 public void p
9、rintStackTrace() /顯示異常棧跟蹤信息 public class Exception extends Throwable public Exception() public Exception(String s) ,13,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),6. RuntimeException運(yùn)行異常類,算術(shù)異常ArithmeticException:除數(shù)為0 空對象異常NullPointerException int a = null; a0 = 1; /對空數(shù)組中的元素進(jìn)行操作 String str = null; str.length() /調(diào)用空對
10、象的方法 類型強(qiáng)制轉(zhuǎn)換異常ClassCastException Object obj = new Object(); String str = (String) obj;,14,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),舉例RuntimeException運(yùn)行異常類,負(fù)數(shù)組長度異常NegativeArraySizeException int a = new int -1; 數(shù)組下標(biāo)越界異常ArrayIndexOutOfBoundsException int a = new int1; a1 = 1; 字符串序號越界異常StringIndexOutOfBoundsException
11、 abc.charAt(-1) 數(shù)值格式異常NumberFormatException int j = Integer.parseInt(abc);,15,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),7. 程序?qū)﹀e誤與異常的三種處理方式,程序不能處理錯誤 程序應(yīng)避免而不捕獲的異常,如除數(shù)為0、數(shù)組下標(biāo)越界等。 必須捕獲的異常,如網(wǎng)絡(luò)連接失敗,16,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),5.2 異常處理措施,5.2.1 異常處理語句 5.2.2 拋出異常 5.2.3 自定義異常類,17,18,在 Java 應(yīng)用程序中,異常處理機(jī)制為:拋出異常,捕捉異常。 拋出異常:
12、當(dāng)一個方法出現(xiàn)錯誤引發(fā)異常時,方法創(chuàng)建異常對象并交付運(yùn)行時系統(tǒng)。 捕獲異常:在方法拋出異常之后,運(yùn)行時系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發(fā)生時依次存留在調(diào)用棧中的方法的集合。,1. 異常處理機(jī)制,19,運(yùn)行時系統(tǒng)從發(fā)生異常的方法開始,依次回查調(diào)用棧中的方法,直至找到含有合適異常處理器的方法并執(zhí)行。當(dāng)運(yùn)行時系統(tǒng)遍歷調(diào)用棧而未找到合適 的異常處理器,異常由JVM處理。同時,意味著Java程序的終止。,2. 異常捕獲的順序,20,3. 異常處理語句-try 和 catch 塊 2-1,try,catch,異常,執(zhí)行 catch 后程序 繼續(xù)正
13、常運(yùn)行,程序控制,引發(fā),代碼塊,單 元,21,try 和 catch 塊 2-2,try 和 catch 塊的用法,public class ArithmeticExceptionDemo public ArithmeticExceptionDemo() private static int calculate(int i, int j) return i / j; public static void main(String args) ArithmeticExceptionDemo obj = new ArithmeticExceptionDemo(); try int result =
14、obj.calculate(9, 0); System.out.println(result); catch (Exception e) System.err.println(發(fā)生異常: + e.toString(); e.printStackTrace(); System.out.println(end); ,如果沒有trycatch,最后的end能否輸出呢?,22,3. finally 塊,try 塊,finally 塊,catch 塊,無異常,異常,try、catch 和 finally 塊的執(zhí)行流程,Finally語句塊是可選的,23,4. 異常處理塊的一般形式,try / 要監(jiān)控錯誤
15、的代碼塊 methodGeneratingException(); catch (Exception e) / Exception e 的異常處理程序 finally / 在 try 結(jié)束前要執(zhí)行的代碼塊 cleanup(); ,5. 多重 catch 塊3-1,一段代碼可能會生成多個異常 當(dāng)引發(fā)異常時,會按順序來查看每個 catch 語句,并執(zhí)行第一個類型與異常類型匹配的語句 (異常類繼承關(guān)系) 執(zhí)行其中的一條 catch 語句之后,其他的 catch 語句將被忽略,24,try . catch(ArrayIndexOutOfBoundsException e) catch(Exceptio
16、n e) ,public class RaiseMulException private static double calclate(int i, int j) return i / j; public static void main(String args) java.util.Date d = null; try System.out.println(calclate(10, 0); System.out.println(d.getTime(); catch (ArithmeticException e) System.out.println(發(fā)生異常1: + e.toString()
17、; catch (NullPointerException e) System.out.println(發(fā)生異常2: + e.toString(); System.out.println(over); ,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),Try catch舉例(多catch-同級別),25,try塊中如果有多個語句產(chǎn)生異常,第一個語句產(chǎn)生異常后,就會立即陷入到catch塊中個,后面產(chǎn)生異常的語句不會執(zhí)行。,public class RaiseMulException2 public static void main(String args) String str = 12
18、3a; java.util.Date d = null; try int i = Integer.parseInt(str); System.out.println(d.getTime(); catch (NumberFormatException ex) System.out.println(str + 字符串不能轉(zhuǎn)換為整數(shù)); catch (Exception ex) ex.printStackTrace(); ,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),Try catch舉例(多catch-不同級別),26,123a字符串不能轉(zhuǎn)換為整數(shù),異常被前一個catch捕獲,后面就不
19、能在被捕獲了。,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),多重catch執(zhí)行流程,27,28,在toIntArray將字符串?dāng)?shù)組轉(zhuǎn)換到整形數(shù)組中使用了trycatchfinally語句。,【例5.1】 求數(shù)組元素的平均值。,6. try-catch語句的范圍,try-catch目的是為了程序能從異常中恢復(fù)過來; 需要對有可能產(chǎn)生異常的語句定位,并使用try-catch,而不是把所有語句都包起來,29,public class TryScope public static void main(String args) String strings = 32, one, 10.8,
20、45 ; float sum = 0; try for (String s : strings) sum += Integer.parseInt(s); System.out.println(sum = + sum); catch (Exception e) e.printStackTrace(); ,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),Try catch范圍舉例,30,能否正確輸出87.8呢?,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),5.2.2 拋出異常,1. 拋出自定義異常對象的throw語句 throw 異常對象 public void set(int
21、 year, int month, int day) if (month12) throw new Exception(月份錯誤); ,31,不想捕獲處理異常拋出異常,public class ThrowsinMethod public static void setMonth(int month) throws Exception if (month12) throw new Exception(月份錯誤); public static void main(String args) try setMonth(13); catch (Exception e) e.printStackTrace
22、(); ,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),2. 方法里拋出異常舉例,32,java.lang.Exception: 月份錯誤 at chapter05.ThrowsinMethod.setMonth(ThrowsinMethod.java:6) at chapter05.ThrowsinMethod.main(ThrowsinMethod.java:12),不再由系統(tǒng)拋出異常,public class ThrowsOnMethod public static void doSomething() throws ClassNotFoundException Class c
23、lz = null; clz = Class.forName(RaiseError); System.out.println(over); public static void main(String args) try doSomething(); catch (ClassNotFoundException e) e.printStackTrace(); System.out.println(over in main); ,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第4版),2. 方法上拋出異常舉例,33,Java語言安全性檢查,異常的拋出和處理不是可有可無的,是被強(qiáng)制要求的。 如上例中
24、,Class.forName語句要求必須處理異常; 如果doSomething不處理異常,而是簡單拋出異常,則調(diào)用doSomething的main方法就要求處理異常。 如果main也不處理,只是拋出異常的話,就由JVM來處理異常。,34,5.2.3 自定義異常類,自定義異常概念 使用自定義異常的時候 JavaAPI提供的內(nèi)置異常不一定總能捕獲程序中發(fā)生的所有錯誤。有時會需要創(chuàng)建用戶自定義異常 自定義異常需要繼承Exception 及其子類,1. 自定義異常類例子,武漢理工大學(xué)信息學(xué)院Java程序設(shè)計實(shí)用教程(第3版),35,public class DateException extends
25、Exception public DateException(String s) super(s); public DateException() super(); ,public void set(int year, int month, int day) throws DateException /設(shè)置正確日期 if (year2500) throw new DateException(年份不合適,有效年份為02500。); if (month12) throw new DateException(月份錯誤); if (daydaysOfMonth(year, month) throw n
26、ew DateException(日期錯誤); this.aday.set(year, month, day); ,當(dāng)調(diào)用一個拋出異常的方法,調(diào)用者必須處理這個異常。 如構(gòu)造方法必須處理DateException. Main方法new對象時,小結(jié),內(nèi)容和要求: 發(fā)現(xiàn)各種程序錯誤,采取不同的手段排除錯誤。 理解異常處理機(jī)制的運(yùn)行方式,掌握J(rèn)ava異常的拋出、捕獲及處理方法。 熟悉自定義異常在程序設(shè)計中的作用。 重點(diǎn):掌握try語句捕獲異常并處理。 難點(diǎn):捕獲并處理異常,拋出異常、使異常在方法間傳遞。,1. 程序中的錯誤有哪幾種?分別能夠在什么時刻被發(fā)現(xiàn)?,習(xí) 題,武漢理工大學(xué)信息學(xué)院Java程序
27、設(shè)計實(shí)用教程(第4版),37,【答】 程序錯誤按照性質(zhì)可分為3類:語法錯、語義錯、邏輯錯。 1) 語法錯:違反語法規(guī)范的錯誤成為語法錯( syntax error ),這類錯誤通常在編譯時發(fā)現(xiàn),又稱為編譯錯,如標(biāo)識符未聲明、表達(dá)式中運(yùn)算符與操作數(shù)類型不兼容、變量賦值時的類型與聲明時的類型不匹配、括號不匹配、語句末缺少分號等。 2) 語義錯:如果在程序的語法上正確,但在語義上存在錯誤,則稱為語義錯( semantic error),又稱為運(yùn)行錯(run-time error),語義錯不能被編譯系統(tǒng)發(fā)現(xiàn),只有到程序運(yùn)行時才能被發(fā)現(xiàn),如輸入數(shù)據(jù)格式錯、除數(shù)為0錯、給變量賦予超出其范圍的值錯等。 3)
28、 邏輯錯:如果程序通過編譯,可運(yùn)行,但運(yùn)行結(jié)果與期望值不符,則這類錯誤稱為邏輯錯(logic error),例如,由于循環(huán)條件不正確而沒有結(jié)果,循環(huán)次數(shù)不對等因素導(dǎo)致計算結(jié)果不正確等。,2. Java為什么要采用異常處理機(jī)制?Java的異常處理是怎樣實(shí)現(xiàn)的?異常處理機(jī)制能夠解決程序中遇到的所有錯誤嗎?哪些錯誤不是異常處理能夠解決的?,【答】 異常處理和捕獲和處理運(yùn)行時錯誤的一種機(jī)制。異常處理機(jī)制使程序具有處理錯誤的能力。 即使發(fā)生了運(yùn)行錯,應(yīng)用程序能夠捕獲異常并及時處理異常,使程序從運(yùn)行錯誤中很好地恢復(fù)并繼續(xù)運(yùn)行,而不會導(dǎo)致程序運(yùn)行非正常終止。而且如果當(dāng)前方法沒有能力處理異常,還可以將異常轉(zhuǎn)交給調(diào)用者處理。 異常處理機(jī)制將運(yùn)行時錯誤封裝成若干錯誤類和異常類,并提供異常處理語句用于處理在程序中實(shí)現(xiàn)對運(yùn)行時錯誤的發(fā)現(xiàn)和及時處理。 異常處理機(jī)制并不能解決程序中的所有錯誤,例如內(nèi)存溢出、棧溢出等。,3. 請說出5個Java的異常類。,【答】 算術(shù)異常ArithmeticException、空對象異常NullPointerException、類型強(qiáng)制轉(zhuǎn)換異常ClassCastException、負(fù)數(shù)組長度異常NegativeArraySizeExcepti
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車險銷售培訓(xùn)課件
- 車隊安全生產(chǎn)知識培訓(xùn)課件
- 車隊安全培訓(xùn)內(nèi)容模板課件
- 車間設(shè)備檢修安全培訓(xùn)課件
- (新)商品混凝土攪拌站的質(zhì)量管理措施(2篇)
- 2025年中小學(xué)德育活動策劃與學(xué)生品格塑造專項工作總結(jié)(3篇)
- 2026年勞動仲裁試題及答案
- 銀行合規(guī)管理制度完善
- 車間安全用電培訓(xùn)課件
- 龜背竹養(yǎng)殖知識培訓(xùn)課件
- 全球變暖課件高級
- 農(nóng)貿(mào)市場保潔服務(wù) 投標(biāo)方案(技術(shù)標(biāo) )
- 合作的合同書模板
- 高壓氣瓶固定支耳加工工藝設(shè)計
- (正式版)FZ∕T 13061-2024 燈芯絨棉本色布
- 0.4kV配網(wǎng)不停電作業(yè)用工器具技術(shù)條件V11
- 滿腹經(jīng)綸相聲臺詞完整篇
- JGT138-2010 建筑玻璃點(diǎn)支承裝置
- 2023年10月自考05678金融法試題及答案含評分標(biāo)準(zhǔn)
- 新蘇教版六年級科學(xué)上冊第一單元《物質(zhì)的變化》全部教案
- 城鎮(zhèn)道路工程施工與質(zhì)量驗(yàn)收規(guī)范CJJ解析及質(zhì)量控制點(diǎn)
評論
0/150
提交評論