在 Java 中處理異常時,通常需要使用 try-catch 區塊來處理它們,而不僅僅是將處理委託給調用這部分程式碼的人。然而,有時無論是否拋出異常,或程式執行流程是否成功完成,都需要執行某些操作,例如關閉檔案、資料庫連線等。
對於這些情況,使用finally 區塊。該區塊放置在 catch 區塊之後,或如果不使用 catch 區塊,甚至放置在 try 區塊之後。放置在finally區塊中的程式碼將在兩種情況下執行:
讓我們考慮一個除法方法,它接收兩個整數並傳回它們之間除法的結果。它使用 try-catch 區塊來處理嘗試除以零時引發的異常,並使用 finally 區塊來列印一條訊息,指示正在清理資源。
public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage()); throw e; } finally { System.out.println("Cleaning up resources..."); } }
透過使用值10和2呼叫divide方法,將獲得以下輸出:
Cleaning up resources... 5
如我們所見,沒有拋出異常,因此該方法傳回了除法的結果,並且執行了finally區塊,儘管finally區塊的輸出首先顯示。另一方面,如果使用值10和0呼叫divide方法,將獲得以下輸出:
Error: / by zero Cleaning up resources... Exception in thread "main" java.lang.ArithmeticException: / by zero ...
在這種情況下,拋出了異常,因此執行流程被中斷,並執行了catch區塊,但在再次拋出異常之前,執行了finally區塊。在這兩個範例中,我們都看到無論獲得的結果如何,finally 區塊總是被執行。
finally 區塊的主要用途是釋放 try 區塊中已使用的資源,例如關閉檔案、資料庫連線或網路連線。為了舉例說明這一點,讓我們考慮一個 readFile 方法,該方法讀取檔案的內容並傳回第一行。它使用 try-catch 區塊來處理無法讀取檔案時引發的異常,並使用 finally 區塊來關閉檔案。
public static String readFile() throws IOException { FileReader reader = null; try { reader = new FileReader("file.txt"); BufferedReader buffer = new BufferedReader(reader); return buffer.readLine(); } catch (IOException e) { System.out.println("Error: " + e.getMessage()); throw new RuntimeException(e); } finally { if (reader != null) reader.close(); } }
如果執行readFile方法而無法讀取文件,則會得到以下輸出:
public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage()); throw e; } finally { System.out.println("Cleaning up resources..."); } }
我們可以看到,拋出了異常,因此執行流程被中斷,並執行了catch區塊,但在再次拋出異常之前,執行了finally區塊以關閉檔案。另一方面,如果建立一個 file.txt 文件,其內容為 Hello world!呼叫 readFile 方法,將獲得以下輸出,不會拋出任何例外:
Cleaning up resources... 5
此範例中需要考慮的一些方面是:
finally 在 Java 中的使用已經變得如此普遍,以至於語言本身有一個替代方案可以讓我們簡化資源管理,即 try-with-resources 區塊。此區塊負責在資源使用結束時自動關閉資源,因此無需使用finally 區塊來釋放資源。但是,需要注意的是,finally 區塊在某些情況下仍然有用,並且兩個選項可以一起使用。
以上是Java中的finally區塊的詳細內容。更多資訊請關注PHP中文網其他相關文章!