版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、異常處理異常處理補充:枚舉類型補充:枚舉類型 Syntax errors (語法錯誤)(語法錯誤)-編譯過程中出現(xiàn)的錯編譯過程中出現(xiàn)的錯誤,通過編譯器檢測。誤,通過編譯器檢測。 Runtime errors (運行時錯誤)引起程序非正常(運行時錯誤)引起程序非正常中斷的錯誤。中斷的錯誤。 Logic errors (邏輯錯誤)指程序沒有按期望的要(邏輯錯誤)指程序沒有按期望的要求執(zhí)行。求執(zhí)行。 import javax.swing.JOptionPane; public class Test public static void main(String args) String input =
2、 JOptionPane.showInputDialog(null, Please enter an integer); int number = Integer.parseInt(input); / Display the result JOptionPane.showMessageDialog(null, The number entered is + number); System.exit(0); 如果這行出現(xiàn)異常,將跳過其余的行,程序終止。如果這行出現(xiàn)異常,將跳過其余的行,程序終止。 import javax.swing.JOptionPane; public class Test
3、public static void main(String args) try String input = JOptionPane.showInputDialog(null, Please enter an integer); int number = Integer.parseInt(input); / Display the result JOptionPane.showMessageDialog(null, The number entered is + number); catch (Exception ex) JOptionPane.showMessageDialog(null,
4、 Incorrect input: an integer is required); System.out.println(Execution continues .); System.exit(0); 如如果果這這行行出出現(xiàn)現(xiàn)異異常常,就就會會跳跳過過try子子句句中中其其余余的的行行,并并把把程程序序控控制制轉(zhuǎn)轉(zhuǎn)移移到到catch子子句句 捕捕獲獲并并處處理理這這個個異異常常后后,程程序序控控制制轉(zhuǎn)轉(zhuǎn)移移到到try-catch塊塊之之后后的的第第一一條條語語句句 LinkageE rror E rror A WTE rror A WTE xception T hrow ab le Clas
5、sN otF oundE xception VirtualM achineE rror IOE xception E xcep tion Runtim eE xcep tion Object Arithm eticE xcep tion NullP ointerE xception Ind exOutOfBound sE xception 其其 他他 類類 其其 他他 類類 其其 他他 類類 IllegalArgum entE xception 圖見P353描述見P354 LinkageError Error AW TE rror AW TE xception Throw able Class
6、NotF oundE xception V irtualM achineError IOE xception Exception RuntimeException Object ArithmeticE xception NullPointerException IndexOu tOfB oundsE xception 其 他 類 其 他 類 其 他 類 IllegalArgu mentE xception System errors 是由是由JAVA虛擬機拋出并在虛擬機拋出并在Error類類中描述的。中描述的。Error類描述類描述內(nèi)部的系統(tǒng)錯誤。這種錯內(nèi)部的系統(tǒng)錯誤。這種錯誤很少發(fā)生,如果發(fā)
7、生,誤很少發(fā)生,如果發(fā)生,除了通知用戶以及盡量穩(wěn)除了通知用戶以及盡量穩(wěn)妥地結(jié)束程序外,幾乎什妥地結(jié)束程序外,幾乎什么也不能做。么也不能做。 LinkageError Error AW TE rror AW TE xception Throw able ClassNotF oundE xception V irtualM achineError IOE xception Exception RuntimeException Object ArithmeticE xception NullPointerException IndexOu tOfB oundsE xception 其 他 類 其 他
8、 類 其 他 類 IllegalArgu mentE xception Exceptions 是由是由Exception類描述的。類描述的。 Exception類描述由程序類描述由程序和外部環(huán)境引起的錯誤和外部環(huán)境引起的錯誤,這些錯誤能通過程序,這些錯誤能通過程序捕獲和處理。捕獲和處理。 LinkageError Error AW TE rror AW TE xception Throw able ClassNotF oundE xception V irtualM achineError IOE xception Exception RuntimeException Object Arith
9、meticE xception NullPointerException IndexOu tOfB oundsE xception 其 他類 其 他類 其 他類 IllegalArgu mentE xception Runtime exceptions 是由是由 RuntimeException 類描述編類描述編程錯誤,比如不合適的轉(zhuǎn)換程錯誤,比如不合適的轉(zhuǎn)換,訪問一個越界數(shù)值或數(shù)值,訪問一個越界數(shù)值或數(shù)值錯誤等。運行異常通常由錯誤等。運行異常通常由JAVA虛擬機拋出。虛擬機拋出。 RuntimeException, Error 以及它們的子類以及它們的子類都稱為免檢異常(都稱為免檢異常(un
10、checked exceptions). 所有其他異常都稱為必檢異常(所有其他異常都稱為必檢異常(checked exceptions). unchecked exception 是程序設(shè)計中不可重獲的邏輯錯誤。是程序設(shè)計中不可重獲的邏輯錯誤。 checked exception 編譯器強制程序員檢查并處理異常編譯器強制程序員檢查并處理異常Page 354 LinkageError Error AW TError AW TException Throwable ClassNotFoundException VirtualM achineError IOException Exception R
11、untimeException Object ArithmeticException NullPointerException IndexOutOfBoundsException Several more classes Several more classes Several more classes IllegalArgum entException Unchecked ExceptionsJava 不能保證你的代不能保證你的代碼能夠捕獲或聲明碼能夠捕獲或聲明unchecked exceptions.說明說明:Exception類及子類及子類都是是可以捕獲的,類都是是可以捕獲的,但是但是J
12、VM只強制你捕獲只強制你捕獲checked Excepions. method1() try invoke method2; catch (Exception ex) Process exception; method2() throws Exception if (an error occurs) throw new Exception(); catch exceptiondeclare exceptionthrow exceptionPage 355聲明異常(聲明異常(declaring exceptions)-每個方法每個方法都必須說明它可能拋出的必檢異常的類型都必須說明它可能拋出的必檢
13、異常的類型. 如:如:public void myMethod() throws IOException public void myMethod() throws IOException, OtherException 拋出異常(拋出異常(throwing an exception)程序檢測)程序檢測到一個錯誤后,創(chuàng)建一個適當類型異常的實例到一個錯誤后,創(chuàng)建一個適當類型異常的實例并拋出它。并拋出它。這里有一個例子:這里有一個例子:throw new TheException(); TheException ex = new TheException();throw ex; /* Set a
14、new radius */ public void setRadius(double newRadius) if (newRadius = 0) radius = newRadius; else throw new IllegalArgumentException( Radius cannot be negative); try statements; / Statements that may throw exceptionscatch (Exception1 exVar1) handler for exception1;catch (Exception2 exVar2) handler f
15、or exception2;.catch (ExceptionN exVar3) handler for exceptionN; page 357 public String getMessage() 返回返回Throwable對象的詳細信息對象的詳細信息 public String toString() 返回返回3個字符串合起來的串,它們分別是:異個字符串合起來的串,它們分別是:異常類名的全稱;常類名的全稱; “:”一個一個冒號冒號和一個空格;和一個空格; getMessage()方法。方法。 public void printStackTrace() 在控制臺上輸出在控制臺上輸出Throw
16、able對象及其蹤跡信息對象及其蹤跡信息。 問題:問題: 本例演示如何聲明、拋出和捕獲異本例演示如何聲明、拋出和捕獲異常,改寫前面編寫的常,改寫前面編寫的setRadius 方法,如果方法,如果半徑是負的,新的半徑是負的,新的 setRadius 方法拋出一方法拋出一個異常。個異常。page 358 outputjava.lang.IllegalArgumentException: Radius cannot be negativeNumber of objects created: 1System.out.println(ex);is equivalent toSystem.out.prin
17、tln(ex.toString();說明:在此例中,由于說明:在此例中,由于IllegalArgumentException是一個是一個RuntimeException (unchecked Exception),所以在測試程序中若沒有編寫,所以在測試程序中若沒有編寫try-catch代碼,編譯代碼,編譯時不會報錯,只會在運行時拋出異常。時不會報錯,只會在運行時拋出異常。(棧跟蹤棧跟蹤) 輸出輸出 (no try-catch block)Exception in thread main java.lang.IllegalArgumentException: Radius cannot be n
18、egativeat CircleWithException.setRadius(CircleWithException.java:30)at CircleWithException.(CircleWithException.java:15)at TestCircleWithException.main(TestCircleWithException.java:5)說明:若把程序中的說明:若把程序中的try-catch都刪除,就會顯示以上的運行效果,從運行中可都刪除,就會顯示以上的運行效果,從運行中可以看出異常棧的跟蹤次序。以看出異常棧的跟蹤次序。另外,若保留另外,若保留try-catch塊,在
19、代碼中執(zhí)行塊,在代碼中執(zhí)行ex.printStackTrace()也可以顯示異也可以顯示異常棧。常棧。Java 強迫程序員處理必檢異常強迫程序員處理必檢異常如果方法聲明了一個必檢異常,必須在如果方法聲明了一個必檢異常,必須在try-catch 塊中塊中調(diào)用它或者在調(diào)用它方法中聲明拋出異常。例如調(diào)用它或者在調(diào)用它方法中聲明拋出異常。例如, 假設(shè)假設(shè)方法方法 p1 調(diào)用方法調(diào)用方法 p2 。方法。方法 p2 將拋出一個異常將拋出一個異常 (e.g., IOException), 程序員必須按照程序員必須按照(A) 和和(B)編寫程序編寫程序. void p1() try p2(); catch (
20、IOException ex) . void p1() throws IOException p2(); (A)(B)main method . try . invoke method1; statement1; catch (Exception1 ex1) Process ex1; statement2;method1 . try . invoke method2; statement3; catch (Exception2 ex2) Process ex2; statement4;method2 . try . invoke method3; statement5; catch (Exce
21、ption3 ex3) Process ex3; statement6;An exception is thrown in method3page 356 在在catch子句中制定異常的順序是非常重要子句中制定異常的順序是非常重要的。的。try catch(Exception ex) catch (RuntimeExcepiton ex) wrongtry catch (RuntimeExcepiton ex) catch(Exception ex) correctpage 552page 357try statements;catch(TheException e) handling e;
22、finally finalStatements; 說明:無論之前的說明:無論之前的try和和catch塊中發(fā)生了什么,以下塊中發(fā)生了什么,以下finally代碼塊中的代代碼塊中的代碼都碼都一定一定會執(zhí)行:會執(zhí)行:try代碼塊執(zhí)行完成,沒有發(fā)生異常;代碼塊執(zhí)行完成,沒有發(fā)生異常;try代碼塊發(fā)生異常,被某個代碼塊發(fā)生異常,被某個catch代碼塊處理;代碼塊處理;try代碼塊發(fā)生異常,沒有被任何一個代碼塊發(fā)生異常,沒有被任何一個catch代碼塊處理。代碼塊處理。Note:Catch blocks are unnecessary if a finally block is present:try f
23、inally 異常處理可以將錯誤處理代碼從正常的編程異常處理可以將錯誤處理代碼從正常的編程任務(wù)分離出來,這樣可以使程序變得容易閱任務(wù)分離出來,這樣可以使程序變得容易閱讀和修改,然而應(yīng)該注意,由于異常處理需讀和修改,然而應(yīng)該注意,由于異常處理需要初始化新的異常對象并重返調(diào)用堆棧,并要初始化新的異常對象并重返調(diào)用堆棧,并且通過方法調(diào)用鏈傳播異常以便搜尋異常處且通過方法調(diào)用鏈傳播異常以便搜尋異常處理器。理器。Page 361 一個方法出現(xiàn)異常時,如果想讓該方法的調(diào)一個方法出現(xiàn)異常時,如果想讓該方法的調(diào)用者處理異常,應(yīng)該創(chuàng)建一個異常對象并對用者處理異常,應(yīng)該創(chuàng)建一個異常對象并對其拋出。如果能在發(fā)生其拋
24、出。如果能在發(fā)生 異常的方法中處理異異常的方法中處理異常,那么就不需要拋出異常。常,那么就不需要拋出異常。在代碼中,應(yīng)該什么時候使用在代碼中,應(yīng)該什么時候使用try-catch塊?當必須處塊?當必須處理不可預(yù)料的錯誤時應(yīng)該使用。不要用理不可預(yù)料的錯誤時應(yīng)該使用。不要用try-catch塊處塊處理簡單、可預(yù)料的情況。例如下述代碼:理簡單、可預(yù)料的情況。例如下述代碼: try System.out.println(refVar.toString();catch (NullPointerException ex) System.out.println(refVar is null);最好用以下代碼代
25、替最好用以下代碼代替 if (refVar != null) System.out.println(refVar.toString();else System.out.println(refVar is null);注意:不要用異常捕獲來解決那些可以用注意:不要用異常捕獲來解決那些可以用if語句判斷的簡單錯誤。語句判斷的簡單錯誤。 try statements;catch(TheException ex) perform operations before exits; throw ex;語句語句 throw ex 重新拋出異常,以便其他處理器獲得處理異常重新拋出異常,以便其他處理器獲得處理異
26、常ex的機的機會。會。Page 361 要創(chuàng)建自定義異常類型,需要利用繼承來要創(chuàng)建自定義異常類型,需要利用繼承來擴展某個預(yù)定義擴展某個預(yù)定義Java異常類。通常是直接異常類。通常是直接擴展通用的擴展通用的Exception類:類:public class MissingValueException extends Exception 最簡單的自定義異常類:最簡單的自定義異常類:public class MissingValueException extends Exception 選講選講 簡單的自定義異常類:簡單的自定義異常類:public class MissingValueExcepti
27、on extends Exception /Constructorpublic MissingValueException(String message) super(message); Exception類包含了類包含了public Exception(String message)方方法;法; Exception類包含了類包含了String getMessage()方法,用于將這方法,用于將這個傳入的個傳入的message信息顯示出來信息顯示出來; 因此自定義的異常類可以調(diào)用因此自定義的異常類可以調(diào)用super(message);方法初始方法初始化父類,并且此自定義類也自動繼承了化父類,并
28、且此自定義類也自動繼承了getMessage()方方法,用于顯示異常信息串。法,用于顯示異常信息串。public class MissingValueException extends Exception private Student student;public MissingValueException(Student s, String message) super(message);student = s;public Student getStudent() return student;定義異常類,此類存儲在定義異常類,此類存儲在MissingValueException.jav
29、a文件中。文件中。public class Student private String name;private String ssn;public String getSsn() . public void setSsn() . public String getName() . public void setName(String n) throws MissingValueException if (n.equals() throw new MissingValueException(this,A students name cannot be blank);else name = n
30、;/ etc.使異常類在使異常類在Student類中類中運作。運作。public class Example public static void main(String args) String name = read value from GUI;Student s = new Student();s.setName(name);/ etc.在試圖調(diào)用在試圖調(diào)用setName方法的那行代碼上將產(chǎn)生編譯錯誤:方法的那行代碼上將產(chǎn)生編譯錯誤:Unreported exception MissingValueException; must be caught or declared to be
31、thrown s.setName(name);因為在因為在Student類的類的setName方法聲明中包含了方法聲明中包含了throws MissingValueException子句,子句,java編譯器強制客戶代碼捕獲這個類型編譯器強制客戶代碼捕獲這個類型的異常。的異常。偽代碼偽代碼public class Example public static void main(String args) String name = read value from GUI;Student s = new Student();try s.setName(name);catch (MissingVal
32、ueException e) System.out.println(e.getMessage();System.out.println(ID of affected student: +e.getStudent().getSsn();/ etc.輸出結(jié)果:輸出結(jié)果:A students name cannot be blankID of affected student: 123-45-6789偽代碼偽代碼此處假設(shè)在調(diào)用此處假設(shè)在調(diào)用setName之前之前已經(jīng)為已經(jīng)為ssn屬性賦了初值。屬性賦了初值。 將變量的取值約束到一個有限的集合。將變量的取值約束到一個有限的集合。 例如:只希望學(xué)位的取值
33、為:例如:只希望學(xué)位的取值為: Mathematics Biology Chemistry Computer Science Physical Education 為保證客戶代碼不會傳入一個不正確的專業(yè)值,因此創(chuàng)造為保證客戶代碼不會傳入一個不正確的專業(yè)值,因此創(chuàng)造一個自定義異常類型一個自定義異常類型InvalidMajorExcetion,代碼如下所,代碼如下所示:示:JDK 1.5特征特征public class Student private String name;private String major;public Student(String name, String major)
34、 throws InvalidMajorException this.setName(name);if (major not one of the five approved majors) throw new InvalidMajorException();else this.setMajor(major);/ 在運行時,若傳入錯誤的參數(shù),則會丟出異常在運行時,若傳入錯誤的參數(shù),則會丟出異常try Student s = new Student(Dorothy Jost, Culinary Arts); catch (InvalidMajorException e) . 此例的缺點在于:只有
35、在此例的缺點在于:只有在運行運行時異常才能發(fā)生,不時異常才能發(fā)生,不能防止客戶代碼在能防止客戶代碼在編譯編譯時時進行錯誤檢測。進行錯誤檢測。public enum Major / Define name/value pairsMath(Mathematics),Bio(Biology),Chem(Chemistry),CS(Computer Science),PhysEd(Physical Education);/Declare the value attribute to be of type String.private final String value;/ The construct
36、or takes a String argument.Major(String v) value = v;/ The method has a return type of String.public String value() return value;public class Student private String name;private Major major;public Student(String name, Major major) this.setName(name);this.setMajor(major);public void setName(String n)
37、 name = n;public void setMajor(Major m) major = m;public void display() System.out.println(name + is a + major.value() + major.);public class EnumExample public static void main(String args) Student s = new Student(Fred Schnurd, Major.CS);s.display();Output:Fred Schnurd is a Computer Science major./ 如果把如果把display()方法中的方法中的major.value()改為改為major:public void display() System.out.println(name + is a + major + major.);Output:Fred Schnurd is a CS major. 采用枚舉類型之后,如果客戶代碼傳入了采用枚舉類型之后,如果客戶代碼傳入了錯誤的專業(yè)信息,則錯誤的專業(yè)信息,則Java會在編譯時進行會在編譯時進行提示:提示:Student s = new Student(Fred Schnurd, Basketweaving);Studen
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采購基金服務(wù)合同
- 九年級道德與法治下冊 第二單元 世界舞臺上的中國 第四課 與世界共發(fā)展 第一框 中國的機遇與挑戰(zhàn)教案 新人教版
- 二年級品德與生活下冊 大自然中的伙伴教案 遼海版
- 安徽省滁州二中九年級體育 第21次課教案
- 2024年秋七年級英語上冊 Unit 1 This is me Grammar教案 (新版)牛津版
- 2024秋八年級物理上冊 第1章 機械運動 第3節(jié) 運動的快慢教案(新版)新人教版
- 2023六年級英語上冊 Unit 11 Shall we go to the theatre說課稿 湘少版
- 廚房管理規(guī)章制度
- 租賃交通標志合同范本(2篇)
- 屈原 節(jié)選 課件
- 人教版三年級數(shù)學(xué)上冊期中考試試卷帶答案
- 八年級數(shù)學(xué)家長會課件
- 繽紛舞曲-《青年友誼圓舞曲》教學(xué)課件-2024-2025學(xué)年人音版(簡譜)(2024)七年級音樂上冊
- 2024年危重患者護理管理制度范本(五篇)
- 院感手衛(wèi)生試題及答案
- 2024-2025學(xué)年陜西省西安交大附中高二(上)第一次月考數(shù)學(xué)試卷(含答案)
- 14孔子論孝教案-藍色
- 水廠轉(zhuǎn)讓合同模板
- 中國記者日介紹主題班會 課件
- 會計領(lǐng)軍人才筆試題庫及答案
- JJF(京) 94-2022 烷基汞分析儀校準規(guī)范
評論
0/150
提交評論