1. 程式人生 > >【八】Java的異常處理

【八】Java的異常處理

一、基本概念

看java的異常結構圖

Throwable是所有異常的根,java.lang.Throwable
Error是錯誤,java.lang.Error
Exception是異常,java.lang.Exception


二、Exception

一般分為Checked異常和Runtime異常,所有RuntimeException類及其子類的例項被稱為Runtime異常,不屬於該範疇的異常則被稱為CheckedException。


①Checked異常

只有java語言提供了Checked異常,Java認為Checked異常都是可以被處理的異常,所以Java程式必須顯示處理Checked異常。如果程式沒有處理Checked異常,該程式在編譯時就會

發生錯誤無法編譯。這體現了Java的設計哲學:沒有完善錯誤處理的程式碼根本沒有機會被執行。對Checked異常處理方法有兩種

1 當前方法知道如何處理該異常,則用try...catch塊來處理該異常。
2 當前方法不知道如何處理,則在定義該方法是宣告丟擲該異常。

[java] view plain copy print?
  1. package cn.xy.test;  
  2. import java.io.IOException;  
  3. /** 
  4.  * Checked異常測試方法 
  5.  * @author xy 
  6.  * 
  7.  */
  8. publicclass CheckedExceptionMethods  
  9. {  
  10.     // 總異常類,既有checkedException又有RuntimeException,所以其中的checkedException必須處理
  11.     publicvoid method1() throws Exception  
  12.     {  
  13.         System.out.println("我是丟擲異常總類的方法");  
  14.     }  
  15.     // 捕獲並處理這個異常
  16.     publicvoid testMethod1_01()  
  17.     {  
  18.         try
  19.         {  
  20.             method1();  
  21.         }  
  22.         catch (Exception e)  
  23.         {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.     // 把異常傳遞下去
  28.     publicvoid testMethod1_02() throws Exception  
  29.     {  
  30.         method1();  
  31.     }  
  32.     publicvoid testMethod1_03() throws Exception  
  33.     {  
  34.         thrownew Exception();  
  35.     }  
  36.     publicvoid testMethod1_04()  
  37.     {  
  38.         try
  39.         {  
  40.             thrownew Exception();  
  41.         }  
  42.         catch (Exception e)  
  43.         {  
  44.             e.printStackTrace();  
  45.         }  
  46.     }  
  47.     // checkedException典型代表IOException
  48.     publicvoid method2() throws IOException  
  49.     {  
  50.         System.out.println("我是丟擲IO異常的方法");  
  51.     }  
  52.     publicvoid testMethod2_01()  
  53.     {  
  54.         try
  55.         {  
  56.             method2();  
  57.         }  
  58.         catch (Exception e)  
  59.         {  
  60.             e.printStackTrace();  
  61.         }  
  62.     }  
  63.     publicvoid testMethod2_02() throws Exception  
  64.     {  
  65.         method2();  
  66.     }  
  67. }  

我們比較熟悉的Checked異常有

Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException

Java.lang.FileNoFoundException

②RuntimeException

Runtime如除數是0和陣列下標越界等,其產生頻繁,處理麻煩,若顯示申明或者捕獲將會對程式的可讀性和執行效率影響很大。所以由系統自動檢測並將它們交給預設的異常處理程式。當然如果你有處理要求也可以顯示捕獲它們。

[java] view plain copy print?
  1. package cn.xy.test;  
  2. /** 
  3.  * 執行時異常測試方法 
  4.  * @author xy 
  5.  * 
  6.  */
  7. publicclass RuntimeExcetionMethods  
  8. {  
  9.     publicvoid method3() throws RuntimeException  
  10.     {  
  11.         System.out.println("我是丟擲執行時異常的方法");  
  12.     }  
  13.     publicvoid testMethod3_01()  
  14.     {  
  15.         method3();  
  16.     }  
  17.     publicvoid testMethod1_02()  
  18.     {  
  19.         thrownew RuntimeException();  
  20.     }  
  21. }  


我們比較熟悉的RumtimeException類的子類有

Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException


三、Error

當程式發生不可控的錯誤時,通常做法是通知使用者並中止程式的執行。與異常不同的是Error及其子類的物件不應被丟擲。

Error是throwable的子類,代表編譯時間和系統錯誤,用於指示合理的應用程式不應該試圖捕獲的嚴重問題。

Error由Java虛擬機器生成並丟擲,包括動態連結失敗,虛擬機器錯誤等。程式對其不做處理。