標籤:
儘管由Java運行時系統提供的預設例外處理常式對於調試是很有用的,但通常你希望自己處理異常。這樣做有兩個好處。第一,它允許你修正錯誤。第二,它防止程式自動終止。大多數使用者對於在程式終止運行和在無論何時錯誤發生都會列印堆棧軌跡感到很煩惱(至少可以這麼說)。幸運的是,這很容易避免。
為防止和處理一個執行階段錯誤,只需要把你所要監控的代碼放進一個try塊就可以了。緊跟著try塊的,包括一個說明你希望捕獲的錯誤類型的catch子句。完成這個任務很簡單,下面的程式包含一個處理因為被零除而產生的ArithmeticException 異常的try塊和一個catch子句。
1 class Exc2 { 2 public static void main(String args[]) { 3 int d, a; 4 try { // monitor a block of code. 5 d = 0; 6 a = 42 / d; 7 System.out.println("This will not be printed."); 8 } catch (ArithmeticException e) { // catch divide-by-zero error 9 System.out.println("Division by zero.");10 }11 System.out.println("After catch statement.");12 }13 }
該程式輸出如下:
1 Division by zero.2 After catch statement.
注意在try塊中的對println( )的調用是永遠不會執行的。一旦異常被引發,程式控制由try塊轉到catch塊。執行永遠不會從catch塊“返回”到try塊。因此,“This will not be printed。”
將不會被顯示。一旦執行了catch語句,程式控制從整個try/catch機制的下面一行繼續。
一個try和它的catch語句形成了一個單元。catch子句的範圍限制於try語句前面所定義的語句。一個catch語句不能捕獲另一個try聲明所引發的異常(除非是嵌套的try語句情況)。
被try保護的語句聲明必須在一個大括弧之內(也就是說,它們必須在一個塊中)。你不能單獨使用try。
構造catch子句的目的是解決異常情況並且像錯誤沒有發生一樣繼續運行。例如,下面的程式中,每一個for迴圈的反覆得到兩個隨機整數。這兩個整數分別被對方除,結果用來除12345。最後的結果存在a中。如果一個除法操作導致被零除錯誤,它將被捕獲,a的值設為零,程式繼續運行。
1 // Handle an exception and move on. 2 import java.util.Random; 3 4 class HandleError { 5 public static void main(String args[]) { 6 int a=0, b=0, c=0; 7 Random r = new Random(); 8 9 for(int i=0; i<32000; i++) {10 try {11 b = r.nextInt();12 c = r.nextInt();13 a = 12345 / (b/c);14 } catch (ArithmeticException e) {15 System.out.println("Division by zero.");16 a = 0; // set a to zero and continue17 }18 System.out.println("a: " + a);19 }20 }21 }
顯示一個異常的描述
Throwable重載toString( )方法(由Object定義),所以它返回一個包含異常描述的字串。你可以通過在println( )中傳給異常一個參數來顯示該異常的描述。例如,前面程式的catch塊可以被重寫成
1 catch (ArithmeticException e) {2 System.out.println("Exception: " + e);3 a = 0; // set a to zero and continue4 }
當這個版本代替原程式中的版本,程式在標準javaJDK解譯器下運行,每一個被零除錯誤顯示下面的訊息:
1 Exception: java.lang.ArithmeticException: / by zero
儘管在上下文中沒有特殊的值,顯示一個異常描述的能力在其他情況下是很有價值的——特別是當你對異常進行實驗和調試時。
系列文章:
Java知多少(上)
Java知多少(39)interface介面
Java知多少(40)介面和抽象類別的區別
Java知多少(41)泛型詳解
Java知多少(42)泛型萬用字元和型別參數的範圍
Java知多少(43)異常處理基礎
Java知多少(44)異常類型
Java知多少(45)未被捕獲的異常
Java知多少(46)try和catch的使用