在沒有異常處理的程序中如果要回避異常,需要使用大量的判斷語句,配合所想到的錯誤狀況來捕捉程序中可能發生的錯誤。但是這樣勢必會導致程序運行效率降低。
java異常處理機制具有易於使用,可自定義異常類,處理拋出的異常的同時,又不會降低程序運行效率等優點。因而在java程序設計時,應充分的利用異常處理機會,以增進程序的穩定性及效率。
1.異常處理示例及基本格式:
package javaBasics; public class test5 { public static void main(String[] args) { int i = 10; int j = 0; try{ int temp = i/j; //此處會產生異常 System.out.println("計算結果:"+temp); }catch(Exception e){ System.out.println("出現異常:"+e); //打印異常信息 e.printStackTrace(); //打印完整的異常信息 }finally{ System.out.println("不管是否出現異常都執行此代碼"); } System.out.println("計算結束"); } }
程序的運行結果wei:
出現異常:java.lang.ArithmeticException: / by zero
不管是否出現異常都執行此代碼
計算結束
2.Exception和error
共同點:
Exception和error是java異常結構中最常用的兩個類,統稱為異常。它們都是throwable的子類
不同點:
Exception表示程序中遇到的異常,可以用try catch進行捕獲
error一般指jvm錯誤,程序中無法捕獲
(拓展:Throwable是Exception的父類,可不可以直接使用Throwable呢?
首先,使用Throwable捕獲異常,在代碼中是沒有任何問題的,但在開發中一般不會使用Throwable處理,因為其有Exception和error兩個子類,Error本身不需要程序處理,而程序中需要處理的是Exception 所以沒有必要使用Throeable)
3.Throw和Throws關鍵字
Throws:在定義一個方法時,使用Throws關鍵字聲明,表示此方法不處理異常,而是交給調用方法來處理
(注意:不要在main方法中使用throws,main方法為一切方法的起點,一切的操作也是由主方法開始的,所以,如果在主方法中使用throws,則程序出現問題后肯定交由jvm處理,將會導致程序中斷。)
Throw:Throw關鍵字是人為的拋出異常,直接拋出異常的實例化對象。
package javaBasics; public class test5 { public static void main(String[] args) { try{ throw new Exception("自己拋出異常"); //拋出異常的實例化對象 }catch(Exception e){ e.printStackTrace(); //捕獲異常 } } }
Throw和Throws結合應用范例:
以下代碼也是開發中使用較多的處理方式
package javaBasics; public class Math { public int div(int i,int j) throws Exception{ int temp = 0; try{ temp = i/j; }catch(Exception e){ //捕獲異常 throw e; //把異常交給被調用處處理 }finally{ System.out.println("計算結束"); } return temp; } } package javaBasics; public class test5 { public static void main(String[] args) { Math math = new Math(); try { System.out.println(math.div(10, 0)); } catch (Exception e) { //進行異常捕獲 // TODO Auto-generated catch block e.printStackTrace(); } } }
程序執行結果:
計算結束
java.lang.ArithmeticException: / by zero
at javaBasics.Math.div(Math.java:7)
at javaBasics.test5.main(test5.java:8)
4.自定義異常類:
package javaBasics; public class MyException extends Exception{ //自定義異常類繼承Exception類 public MyException(String msg){ //構造方法接受異常信息 super(msg); //調用父類中的構造方法 } } package javaBasics; public class test5 { public static void main(String[] args) { try{ throw new MyException("自定義異常信息");//拋出異常 }catch(Exception e){ //異常捕獲處理 e.printStackTrace(); } } }
執行結果:
javaBasics.MyException: 自定義異常信息
at javaBasics.test5.main(test5.java:7)
5.Exception和runtimeException
如下示例:
package javaBasics; public class test5 { public static void main(String[] args) { String str="123a"; int temp = Integer.parseInt(str); //將字符串轉換成int類型 System.out.println(temp*temp); } } 執行結果: Exception in thread "main" java.lang.NumberFormatException: For input string: "123a" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:492) at java.lang.Integer.parseInt(Integer.java:527) at javaBasics.test5.main(test5.java:7)
執行報NumberFormatException 顯然,程序已經中斷,查看Integer類的parseInt方法源碼可以看出throws拋出了NumberFormatException 給方法調用處處理。
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
NumberFormatException 是runtimeException類的子類
可以得出:
Exception在程序中必須使用try。。。catch處理。
RuntimeException可以不用try。。。catch處理,產生異常后直接交給JVM處理。(在開發中最好使用try。。。catch進行處理)