異常處理機制
目錄
- 異常處理機制
- 捕捉異常
- 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中,throw
和 throws
關鍵字都是與異常處理相關的,但它們的用法和目的不同:
throw
throw
關鍵字用於在程式碼中手動丟擲一個異常。它可以用來丟擲任何型別的Throwable
物件,包括Error
、Exception
及其子類。throw
後面通常跟一個異常物件,這個物件可以是Java內建的異常型別,也可以是使用者自定義的異常型別。throw
可以在任何程式碼塊中使用,包括try
、catch
或finally
塊之外。
throws
throws
關鍵字用於在方法簽名中宣告該方法可能會丟擲的異常型別。這相當於是一個“提前告知”,告訴呼叫者這個方法在執行過程中可能會丟擲的異常型別。throws
後面跟著的是異常型別的列表,呼叫者需要處理這些異常,要麼透過try-catch
塊捕獲它們,要麼在呼叫該方法的其它方法的簽名中繼續使用throws
宣告。throws
只能用於方法的宣告中。
下面是 throw
和 throws
的使用示例:
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
}
}