標籤:
異常是程式在執行時發生的事件,它會打斷指令的正常流程。 Java中提供了一種獨特的處理異常的機制,通過異常來處理常式設計中出現的錯誤。 Java異常是一個描述在程式碼片段中發生的異常情況(出錯)的對象。
引發異常: 在Java程式的執行過程中,如果出現了例外狀況事件,就會產生一個異常對象。產生的異常對象將傳遞給Java運行時系統,這一異常的產生和提交過程稱為引發異常。
分類:JRE(系統)產生異常對象人為產生異常對象(明確用throw關鍵字)
異常處理機制:
兩種處理例外的機制: 捕獲異常(try catch finally)聲明異常(throws)Finally與final,finalizer
捕獲異常:
try catch finally
捕獲異常(try catch finally) try{ //會產生異常的代碼 }catch(SomeException e){ //異常處理 } catch(SomeException1 e){ //異常處理 }... }finally{ //有沒有異常都會執行的代碼 }
package com.study4;public class Trycatch { public static void main(String[] args){ System.out.println("開始"); int i = 10; int j = 0; //捕捉異常 try{ int k = i/j; }catch(ArithmeticException e){ System.out.println(e.getMessage());//擷取異常資訊 e.printStackTrace();//列印資訊 } System.out.println("結束"); }}
運行結果:
開始/ by zerojava.lang.ArithmeticException: / by zero at com.study4.Trycatch.main(Trycatch.java:10)結束
人為處理異常:throw
public static void mathod2(){ System.out.println("程式開始"); int i = 10; int j = 0; if (j == 0){ throw new ArithmeticException("被除數不能為0");//拋出異常 } System.out.println("程式結束"); }
運行結果:
程式開始Exception in thread "main" java.lang.ArithmeticException: 被除數不能為0 at com.study4.Trycatch.mathod2(Trycatch.java:25) at com.study4.Trycatch.main(Trycatch.java:5)
說明:
Throws聲明異常Throw拋出異常如果Throw拋出的是一個編譯異常。那麼方法就必須要做throws的異常的聲明。明確的告訴其它的調用者要處理這個編譯異常。
finally的用法:
不管程式是否會出現異常,Finally塊中的代碼都會執行到Finally一般是用來做資源關閉的操作。Finally先與return執行。
代碼舉例:
public static void mathod3(){ try{ Class.forName("com.aa"); }catch(ClassNotFoundException e){ System.out.println("找不到com.aa類"); e.printStackTrace(); }finally{ //無論如何都要執行的代碼 System.out.println("程式繼續運行"); } System.out.println("結束"); }
運行結果:
找不到com.aa類java.lang.ClassNotFoundException: com.aa at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.study4.Trycatch.mathod3(Trycatch.java:35) at com.study4.Trycatch.main(Trycatch.java:7)程式繼續運行結束
自訂異常:
為什麼要自訂異常Java程式員可以定義更多的方法來處理異常自訂異常類能提供更複雜更詳細的方法,這樣能極大地加強軟體的健壯性比如BLException:用一個異常的功能號來找到異常資訊代碼更加清晰 如何自訂異常:第一種定義方式,繼承Exception類第二種定義方式:繼承Throwable 類
代碼:
AgeTooBig.java
package com.study4.self;public class AgeTooBig extends Exception { public AgeTooBig(String message){ super(message); } public AgeTooBig(String message, Throwable cause){ super(message, cause); } public AgeTooBig(Throwable throwable){ super(throwable); }}
AgeTooSmall.java
package com.study4.self;public class AgeTooSmall extends Throwable{ public AgeTooSmall(String message){ super(message); } public AgeTooSmall(String message, Throwable cause){ super(message, cause); } public AgeTooSmall(Throwable throwable){ super(throwable); }}
CheckPerson.java
package com.study4.self;public class CheckPerson { public static void checkage(int age) throws AgeTooSmall{ if (age < 20){ throw new AgeTooSmall("年齡太小"); }else if(age > 40){ throw new AgeTooSmall("年齡太大"); }else{ System.out.println("年齡可以"); } } }
TestMain.java
package com.study4.self;public class TestMain { public static void main(String[] args) { int a = 50; try { CheckPerson.checkage(a); } catch (AgeTooSmall e) { e.printStackTrace(); } }}
運行結果:
com.study4.self.AgeTooSmall: 年齡太大 at com.study4.self.CheckPerson.checkage(CheckPerson.java:8) at com.study4.self.TestMain.main(TestMain.java:7)
使用異常的注意點:
將異常資訊提前檢測出來不要為每個可能會出現異常語句都設定try和catch 一個try塊完全可以跟多個catch避免總是catch Exception,而要catch具體的異常不要壓制、隱瞞異常。將不能處理的異常往外拋不要在迴圈中使用try catch,盡量將try catch放在迴圈外catch異常時,必須先捕獲小的異常,再捕獲大的異常
【學習筆記】java異常