異常和異常處理介紹

異常是程式執行時發生的錯誤。考慮下面的 Java 程式,它劃分兩個整數。

class Division {
    public static void main(String[] args) {
 
        int a, b, result;
 
        Scanner input = new Scanner(System.in);
        System.out.println("Input two integers");
 
        a = input.nextInt();
        b = input.nextInt();
 
        result = a / b;
 
        System.out.println("Result = " + result);
    }
}

現在我們編譯並執行上面的程式碼,並看到嘗試除以零的輸出:

Input two integers
7 0
Exception in thread "main" java.lang.ArithmeticException: / by zero 
    at Division.main(Disivion.java:14)

除以零是一個無效操作,它將產生一個不能表示為整數的值。Java 通過丟擲異常來解決這個問題。在這種情況下,異常是 ArithmeticException 類的一個例項。

注意: 有關建立和讀取堆疊跟蹤的示例說明了兩個數字後的輸出含義。

異常的效用是它允許的流程控制。不使用異常,這個問題的典型解決方案可能是首先檢查是否 b == 0

class Division {
    public static void main(String[] args) {
 
        int a, b, result;

        Scanner input = new Scanner(System.in);
        System.out.println("Input two integers");
 
        a = input.nextInt();
        b = input.nextInt();
 
        if (b == 0) {
            System.out.println("You cannot divide by zero.");
            return;
        }

        result = a / b;
 
        System.out.println("Result = " + result);
    }
}

這會將訊息 You cannot divide by zero. 列印到控制檯,並在使用者嘗試除以零時以優雅的方式退出程式。通過異常處理處理此問題的等效方法是用 try-catch 塊替換 if 流程控制:

...

a = input.nextInt();
b = input.nextInt();
 
try {
    result = a / b;
}
catch (ArithmeticException e) {
    System.out.println("An ArithmeticException occurred. Perhaps you tried to divide by zero.");
    return;
}
 
...  

try catch 塊執行如下:

  1. 開始執行 try 塊中的程式碼。
  2. 如果 try 塊中發生異常,則立即中止並檢查 catch 塊是否捕獲此異常 (在這種情況下,當 Exception 是 ArithmeticException 的例項時)。
  3. 如果捕獲到異常,則將其分配給變數 e 並執行 catch 塊。
  4. 如果 trycatch 塊已完成(即程式碼執行期間未發生未捕獲的異常),則繼續執行 try-catch 塊下面的程式碼。

通常認為將異常處理用作應用程式的正常流控制的一部分是良好的做法,否則行為將是未定義或意外的。例如,代替在方法失敗時返回 null,通常更好的做法是丟擲異常,以便使用該方法的應用程式可以通過上述型別的異常處理為該情境定義自己的流控制。在某種意義上,這解決了必須返回特定型別的問題,因為可以丟擲多種異常中的任何一種來指示發生的特定問題。 **

有關如何以及如何不使用異常的更多建議,請參閱 Java 陷阱 - 異常使用