儘管由Java運行時系統提供的默認異常處理程序對於調試是頗有用的,但一般你但願本身處理異常。這樣作有兩個好處。第一,它容許你修正錯誤。第二,它防止程序自動終止。大多數用戶對於在程序終止運行和在不管什麼時候錯誤發生都會打印堆棧軌跡感到很煩惱(至少能夠這麼說)。幸運的是,這很容易避免。
爲防止和處理一個運行時錯誤,只須要把你所要監控的代碼放進一個try塊就能夠了。緊跟着try塊的,包括一個說明你但願捕獲的錯誤類型的catch子句。完成這個任務很簡單,下面的程序包含一個處理由於被零除而產生的ArithmeticException 異常的try塊和一個catch子句。
class Exc2 {
public static void main(String args[]) {
int d, a;
try { // monitor a block of code.
d = 0;
a = 42 / d;
System.out.println("This will not be printed.");
} catch (ArithmeticException e) { // catch divide-by-zero error
System.out.println("Division by zero.");
}
System.out.println("After catch statement.");
}
}
該程序輸出以下:
Division by zero.
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的值設爲零,程序繼續運行。
// Handle an exception and move on.
import java.util.Random;
class HandleError {
public static void main(String args[]) {
int a=0, b=0, c=0;
Random r = new Random();
for(int i=0; i<32000; i++) {
try {
b = r.nextInt();
c = r.nextInt();
a = 12345 / (b/c);
} catch (ArithmeticException e) {
System.out.println("Division by zero.");
a = 0; // set a to zero and continue
}
System.out.println("a: " + a);
}
}
}java
Throwable重載toString( )方法(由Object定義),因此它返回一個包含異常描述的字符串。你能夠經過在println( )中傳給異常一個參數來顯示該異常的描述。例如,前面程序的catch塊能夠被重寫成
catch (ArithmeticException e) {
System.out.println("Exception: " + e);
a = 0; // set a to zero and continue
}
當這個版本代替原程序中的版本,程序在標準javaJDK解釋器下運行,每個被零除錯誤顯示下面的消息:
Exception: java.lang.ArithmeticException: / by zero
儘管在上下文中沒有特殊的值,顯示一個異常描述的能力在其餘狀況下是頗有價值的——特別是當你對異常進行實驗和調試時。dom