異常處理機制

wen-210162704027發表於2024-08-05

異常處理機制

目錄
  • 異常處理機制
    • 捕捉異常
      • try……catch來捕獲錯誤
      • 多個catch和finally
    • 丟擲異常
      • throw
      • throws
    • 異常的傳播

捕捉異常

try……catch來捕獲錯誤

try {
    String s = processFile(“C:\\test.txt”);
    // ok:
} catch (FileNotFoundException e) {
    // file not found:
} catch (SecurityException e) {
    // no read permission:
} catch (IOException e) {
    // io error:
} catch (Exception e) {
    // other error:
}

  • 這個過程將一直繼續下去,直到異常被處理。這一過程稱為捕獲(catch)異常。如果一個異常回到 main() 方法,並且 main() 也不處理,則程式執行終止
  • 必須捕獲的異常,包括Exception及其子類,但不包括RuntimeException及其子類,這種型別的異常稱為Checked Exception。 不需要捕獲的異常,包括Error及其子類,RuntimeException及其子類。

多個catch和finally

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (UnsupportedEncodingException e) {
        System.out.println("Bad encoding");
    } catch (IOException e) {
        System.out.println("IO error");
    } finally {
        System.out.println("END");
    }
}

丟擲異常

在Java中,throwthrows 關鍵字都是與異常處理相關的,但它們的用法和目的不同:

throw

  • throw 關鍵字用於在程式碼中手動丟擲一個異常。它可以用來丟擲任何型別的 Throwable 物件,包括 ErrorException 及其子類。
  • throw 後面通常跟一個異常物件,這個物件可以是Java內建的異常型別,也可以是使用者自定義的異常型別。
  • throw 可以在任何程式碼塊中使用,包括 trycatchfinally 塊之外。

throws

  • throws 關鍵字用於在方法簽名中宣告該方法可能會丟擲的異常型別。這相當於是一個“提前告知”,告訴呼叫者這個方法在執行過程中可能會丟擲的異常型別。
  • throws 後面跟著的是異常型別的列表,呼叫者需要處理這些異常,要麼透過 try-catch 塊捕獲它們,要麼在呼叫該方法的其它方法的簽名中繼續使用 throws 宣告。
  • throws 只能用於方法的宣告中。

下面是 throwthrows 的使用示例:

public class ExceptionExample {
    
    // 使用 throw 丟擲一個異常
    public static void checkValue(int value) throws Exception {
        if (value < 0) {
            throw new Exception("Negative value is not allowed.");
        }
    }

    // 使用 throws 宣告方法可能會丟擲的異常
    public static void main(String[] args) {
        try {
            checkValue(-1);
        } catch (Exception e) {
            System.out.println("Caught an exception: " + e.getMessage());
        }
    }
}

在這個示例中,checkValue 方法使用 throw 丟擲了一個 Exception 物件,因為它檢測到一個負值。同時,checkValue 方法的宣告中使用了 throws 關鍵字來宣告它可能會丟擲 Exception

總結區別:

  • throw 是用來丟擲一個異常例項。
  • throws 是用來宣告方法可能會丟擲的異常型別。

異常的傳播

public class Main {
    public static void main(String[] args) {
        try {
            process1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static void process1() {
        process2();
    }
    
    static void process2() {
        Integer.parseInt(null); // 會丟擲NumberFormatException
    }

}

相關文章