在程式開發中,錯誤和異常情況是不可避免的。為了讓程式能夠在出現問題時有另外的處理機制並避免直接崩潰,Java 提供了例外處理機制(Exception Handling)。這個機制允許開發者在程式運行時捕捉並處理異常情況,從而提高程式的穩定性和可維護性。
Java 中的例外分為兩類:
1.檢查例外(Checked Exception):在編譯時期必須處理的例外,例如 IOException
。
2.非檢查例外(Unchecked Exception):主要是 RuntimeException
類及其子類,這類例外通常是程式設計錯誤,例如 NullPointerException
或 ArrayIndexOutOfBoundsException
。
例外處理的語法
在 Java 中,使用 try-catch-finally
結構來處理例外。
try {}
用來包裹可能會拋出例外的程式碼。如果在 try 區塊中發生了例外,程式會跳轉到對應的 catch 區塊進行處理。
catch {}
catch 用來捕捉和處理拋出的例外。每個 catch 區塊可以處理一種特定類型的例外。
finally {}
finally 區塊中的程式碼無論是否發生例外都會被執行。通常用來釋放資源,例如關閉文件、資料庫連接等。
import java.io.*;
public class ExceptionHandlingExample {
public static void main(String[] args) {
FileReader file = null;
try {
// 可能會拋出 FileNotFoundException
file = new FileReader("non_existent_file.txt");
BufferedReader reader = new BufferedReader(file);
// 讀取文件內容
System.out.println(reader.readLine());
} catch (FileNotFoundException e) {
// 處理文件未找到的例外
System.out.println("文件未找到:" + e.getMessage());
} catch (IOException e) {
// 處理文件讀取過程中的例外
System.out.println("讀取文件時發生錯誤:" + e.getMessage());
} finally {
// 無論是否發生例外,finally{}內的程式碼都會執行
try {
if (file != null) {
file.close();
}
} catch (IOException e) {
System.out.println("關閉文件時發生錯誤:" + e.getMessage());
}
}
}
}
在方法宣告中使用 throw 關鍵字來表示該方法可能拋出的檢查例外。當方法拋出例外但不進行處理時,可以將處理責任傳遞給調用該方法的地方。
public static void readFile() throws IOException {
FileReader file = new FileReader("somefile.txt");
BufferedReader reader = new BufferedReader(file);
System.out.println(reader.readLine());
file.close();
}
throws IOException
表示 readFile() 方法可能會拋出 IOException,這是一種檢查例外。通常發生在檔案操作時,例如當檔案不存在或無法讀取時。呼叫這個方法的程式碼必須處理這個例外,使用 try-catch 或方法中聲明 throws IOException。
如果上述範例的方法readFile()
被調用,你可以用 try-catch 區塊來捕捉和處理 IOException,如下:
public static void main(String[] args) {
try {
readFile();
} catch (IOException e) {
System.out.println("檔案讀取錯誤: " + e.getMessage());
}
}