Java 中的已檢查和未檢查的異常
本教程介紹了 Java 中已檢查和未檢查的異常是什麼。
在 Java 中,異常是在程式碼執行過程中發生並異常終止執行的情況。此異常可能發生在編譯時或執行時。Java 將異常大致分為兩種型別,檢查的和未檢查的。由編譯器在編譯時檢查的異常稱為已檢查異常。同時,在執行時檢查的異常稱為未檢查異常。
為了處理異常,Java 為每個異常提供了類,例如 NullPointerException
、ArrayIndexOutofBoundsException
、IOException
等。Exception
類位於所有異常類和任何屬於 Exception 子類的頂部
除了 RuntimeException
及其子類是受檢異常。
繼承 RuntimeException
的異常類,例如 ArithmeticException
、NullPointerException
和 ArrayIndexOutOfBoundsException
稱為未經檢查的異常。這些是在執行時檢查的。
Java 中被檢查的異常
讓我們首先了解什麼是異常以及它如何影響程式碼執行。在這個例子中,我們將資料寫入檔案,這段程式碼容易出現諸如 FileNotFoundException
、IOException
等異常。我們沒有提供任何 catch 處理程式,由於這些是檢查異常,Java 編譯器會不編譯程式碼並在編譯時丟擲異常。請參閱下面的示例。
import java.io.FileOutputStream;
public class SimpleTesting {
public static void main(String[] args) {
FileOutputStream fout =
new FileOutputStream("/home/root/eclipse-workspace/java-project/myfile.txt");
fout.write(1256);
fout.close();
System.out.println("Data written successfully");
}
}
輸出:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Unhandled exception type FileNotFoundException
Unhandled exception type IOException
Unhandled exception type IOException
at SimpleTesting.main(SimpleTesting.java:8)
為了避免程式碼的任何異常終止,我們必須為程式碼提供一個 catch
處理程式。下面是與上面相同的程式碼,但它有一個 catch 處理程式,因此程式碼不會在兩者之間終止並正常執行。請參閱下面的示例。
import java.io.FileOutputStream;
public class SimpleTesting {
public static void main(String[] args) {
try {
FileOutputStream fout =
new FileOutputStream("/home/irfan/eclipse-workspace/ddddd/myfile.txt");
fout.write(1256);
fout.close();
System.out.println("Data written successfully");
} catch (Exception e) {
System.out.println(e);
}
}
}
輸出:
Data written successfully
Java 中的未檢查異常
下面的程式碼丟擲 ArrayIndexOutOfBoundsException
,這是一個未經檢查的異常。這段程式碼編譯成功但沒有執行,因為我們正在訪問陣列範圍之外的元素;因此程式碼丟擲執行時異常。請參閱下面的示例。
public class SimpleTesting {
public static void main(String[] args) {
int[] arr = {3, 5, 4, 2, 3};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println(arr[23]);
}
}
輸出:
3
5
4
2
3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 23 out of bounds for length 5
at SimpleTesting.main(SimpleTesting.java:9)