第九章異常處理_第1頁
第九章異常處理_第2頁
第九章異常處理_第3頁
第九章異常處理_第4頁
第九章異常處理_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第九章 異常處理,通過本章的學習,主要掌握以下知識點: 異常處理的機制 捕獲與處理異常 多異常處理 拋出異常 自定義異常類 本章的重點: 異常處理的機制 捕獲與處理異常 本章的難點: 自定義異常類,1、java異常的概念:,異常exception:程序中出現(xiàn)的問題或不常見的情形。 異常由程序或者運行時環(huán)境拋出,并能被捕獲,需要的話可以進行適當?shù)奶幚怼?可能導致異常的原因,試圖被0除;,數(shù)組下標越界;,沒有找到指定的文件;,請求的I/O操作沒有正常的執(zhí)行;,試圖訪問空引用所指的對象;,試圖執(zhí)行一個違反某類安全措施的操作; ,9.1 異常處理的基本概念,9.1.1 錯誤和異常 按照錯誤的性質(zhì)可將程

2、序錯誤分為語法錯、語義錯、邏輯錯。,在Java中的編譯錯誤是由于編寫的程序代碼中存在著語法錯誤,而未能通過由源代碼到字節(jié)碼的編譯過程而產(chǎn)生的錯誤。語法錯誤是由語言的編譯系統(tǒng)負責檢測和報告。沒有編譯錯誤是一個程序能正常運行的基本條件,只要沒有編譯錯誤,Java的源代碼才能被編譯成字節(jié)碼。,運行錯誤是程序運行過程中產(chǎn)生的錯誤,根據(jù)性質(zhì)的不同,運行錯誤又分為系統(tǒng)運行錯誤和邏輯運行錯誤。 系統(tǒng)運行錯誤簡稱為錯誤,是指程序在執(zhí)行過程中所產(chǎn)生對操作系統(tǒng)的損害。 邏輯運行錯誤是指程序不能實現(xiàn)程序員的設計意圖和設計功能而產(chǎn)生的錯誤,這種錯誤也被稱為異常。,異 常,異常:指程序在運行過程中發(fā)生了由于算法考慮不周

3、或軟件設計錯誤等導致的程序異常事件。 錯誤:指程序在執(zhí)行過程中所遇到的硬件或操作系統(tǒng)的錯誤。,異常例子,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語言的異常處理機制,1)拋出異常:在堆棧中創(chuàng)建一個異常對象。 當方法中有一個錯誤發(fā)生后,該方法創(chuàng)建一個異常對象并把它交給運行系統(tǒng)。異常對象中包含了有關異常的信息,如異常類型、發(fā)生錯誤時的程序狀態(tài)等。 2)捕獲異常:找到異常處理程序。 運行時系統(tǒng)在方法調(diào)用堆棧里為被拋出的異常查找處理代碼。運行系統(tǒng)從發(fā)生錯誤的方法開始進行回朔,在方法調(diào)用堆棧里向后搜索,直到找到能處理當前發(fā)生的異常的處理程序的方法。 3)處理異常。 通過方法調(diào)用來處理異常。 4)終止或恢復運行。 如果運行時系統(tǒng)在方法調(diào)用棧查遍了所有的方法

5、(主方法中)而未找到合適的異常處理程序,則運行時系統(tǒng)終止執(zhí)行。,9.2異常處理類,所有異常類型都是 Throwable的子類,用戶程序可能 捕獲的異常,也是用來創(chuàng)建用戶異常類型子類的基類。,用于顯示與Java運行時系統(tǒng)本身有關的錯誤,Error類對象由Java虛擬機生成并拋出; Exception類對象由應用程序處理或拋出。,運行時異常,是程序運行時自動對某些錯誤做出反應而產(chǎn)生的,1、Throwable類是所有異常類型的父類,不能被直接使用,表示任何可以作為異常被拋出的類。 2、Error用來表示編譯時和系統(tǒng)錯誤,表示恢復不是不可能但很困難情況下的一種嚴重問題。比如說內(nèi)存溢出,它不可能執(zhí)行程序

6、處理這樣的問題,一般是和VM有關的問題。,異常類及其子類-2,3、Exception是可以被拋出的基本異常類型,在JAVA類庫、用戶方法以及運行時故障中都可能拋出Exception型異常。 RuntimeException 運行時異常。它表示程序運行正常的話就不會發(fā)生這種問題,這種異常不用在程序中把他們列出來,運行時有問題,會自動被JVM拋出。比如空指針異常,數(shù)組超出異常。 除了運行時例外之外的其他由Exception 繼承來的例外類都是非運行時的例外,例如FileNotFoundException(文件未找到例外)。Java編譯器要求在程序中必須處理這種例外,捕獲例外或者聲明拋棄例外。,Th

7、rowable類的常用方法 public String getMessage() 返回異常的原因 getStackTrace() 返回堆棧跟蹤情況 public void printStackTrace() 打印堆棧的標準錯誤流 printStackTrace(PrintStreams) 打印堆棧的標準打印流 public String toString() 返回簡單描述 .,9.3 捕獲與處理異常,在Java語言中,異常處理是通過try、catch、finally、throw、throws五個關鍵字來實現(xiàn)的。,當一個異常類的對象被捕獲或接收后,用戶程序就會發(fā)生流程跳轉(zhuǎn),系統(tǒng)終止當前的流程而跳

8、轉(zhuǎn)到專門的異常處理語句塊,或直接跳出當前程序和java虛擬機回到操作系統(tǒng)。,2020/8/2,16,在Java的異常處理機制中,提供了try-catch-finally語句來捕獲和處理一個或多個異常,其語法格式如下:,try catch (異常類名 形參對象名) finally ,由try所限定的代碼塊中的語句在執(zhí)行過程中可能會生成例外對象并拋棄。,1、catch必須緊跟在try之后 2、可有多個catch塊,但異常類型必須是層層嵌套的,即先從子類異常,最后才到父類異常。 3、當拋出異常時,異常處理機制將負責搜索參數(shù)與異常類型相匹配的第一個處理程序。 4、只有匹配的catch子句能執(zhí)行,和sw

9、itch不同,不需要break. 5、可通過throwable類提供的方法getMessage(),printStackTrace( ) 來跟蹤異常事件發(fā)生時執(zhí)行堆棧的內(nèi)容。,為異常處理提供一個統(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ù)組下標越界異常); 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后面的語句 System.

13、out.println(a4); catch(Exception e) System.out.println(e.getMessage(); e.printStackTrace(); finally System.out.println(finally i=+x); ,注意:,異常捕獲的過程中做了兩個判斷,一是try程序塊中是否有異常產(chǎn)生,第二個是產(chǎn)生的異常是否和catch后面括號內(nèi)捕獲的異常匹配。 catch塊中的語句應根據(jù)異常的不同而執(zhí)行不同的操作,比較通用的做法是輸出異常和錯誤的相關信息,包括異常名稱、產(chǎn)生異常的方法名等。 處理多異常是應注意catch塊的排列順序,將處理較具體、較常見的

14、異常catch塊應放在前面,而可以與多種異常相比配的catch塊應放在較后的位置。,4、finally語句塊用來為異常處理提供一個統(tǒng)一的出口,finally通常用于對一些資源做清理工作,如關閉打開的文件。 5、finally塊可以省略。 6、當catch塊中包含System.exit(0)時,不執(zhí)行finally語句塊。,9.4 拋出異常,拋出異常的方法: (1)系統(tǒng)自動拋出異常。 (2)使用throw語句拋出異常,用戶程序自定義的異常,必須借助于throw語句來定義何種情況下產(chǎn)生了此種異常對應的錯誤。(手動拋出異常) 格式:throw 由異常類所產(chǎn)生的對象 throw new ArriayI

15、ndexOutOfBoundException();,但是有時候有些錯誤在jvm看來不是錯誤,比如說 int age = 0; age = -100; System.out.println(age); 需要自己手動引發(fā)異常,這就是throw的作用。 int age = 0; age = -100; if(age0) Exception e = new Exception(“throw exception”);/創(chuàng)建異常對象 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); ,例題:,從鍵盤輸入一字符串,當字符串中包含”T”或”t”時,拋出一個算術異常,處理方式為打印出錯信息.,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(請輸入字符串); 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(); ,拋出異常的方法,如果在一個方法內(nèi)部的語句執(zhí)行時可能引發(fā)某種異常,但是并不確定如何處理,則此方法應拋出異常,表明該方法將不對這些異常進行處理,而由該方法的調(diào)用者負責處理。 在程序中的異常沒有用trycatch語句捕獲異常和處理異常的代碼,則可

19、以在程序代碼所在的方法聲明的后面用throws關鍵字聲明該方法要拋出異常。,拋出異常的方法,格式: 修飾符 返回值類型 方法名(參數(shù)列表) throws 異常類列表 “異常類列表”是方法中要拋出的異常類,當異常類多于一個時用“,”隔開。 當一個方法拋出異常后,系統(tǒng)將異常向上傳遞,由調(diào)用它的方法來處理這些異常。,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(成績?yōu)椋?num+ 及格); else System.out.println(成績?yōu)椋?num+ 不及格); catch(NumberFormatException e) System.out.println(輸入的參數(shù)不是數(shù)值類型); catch(Exception e) Syste

21、m.out.println(命令行中沒有提供參數(shù)); ,若方法內(nèi)有使用throw拋出異常的語句或有用trycatch處理異常的語句,則在定義方法的頭部可不用throws子句拋出與其相對應的異常。,IOException類的異常處理 直接由主方法main( )拋出異常,在main( )后加throws IOException子句。 在程序代碼內(nèi)編寫try-catch塊來捕獲由系統(tǒng)拋出的異常。 在main( )后加throws IOException子句拋出異常,也可以在程序中try-catch塊來捕獲由系統(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(請輸入字符串:); 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); ,自定義異常類,聲明一個新的異常類,該異常類必須從Java已有定義的異常類繼承,如Exception、IOException等。 為新的異常類定義屬性和方法,或重載父類的屬性和方法,使這些屬性和方法能夠體現(xiàn)該類所對應的錯誤的信息。,例子: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,習題,關于垃圾收集機制的敘述正確的是( )。 A垃圾收集將檢查并釋放不再使用的內(nèi)存 B程序開發(fā)者必須自己創(chuàng)建一個線程進行內(nèi)存釋放的工作 C垃圾收集允許程序開發(fā)者明確指定并立即釋放該內(nèi)存 D垃圾收集能夠在期望的時間釋放被java對象使用的內(nèi)存,下列哪些語句關于Java內(nèi)存回收的說明是正確的? ( ) A、程序員必須創(chuàng)建一個線程來釋放內(nèi)存 B、內(nèi)存回收程序負責釋放無用內(nèi)存 C、內(nèi)存回收程序允許程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論