首頁 > Java > java教程 > 主體

Java中的finally區塊

Mary-Kate Olsen
發布: 2024-11-13 02:10:02
原創
618 人瀏覽過

El bloque finally en Java

在 Java 中處理異常時,通常需要使用 try-catch 區塊來處理它們,而不僅僅是將處理委託給調用這部分程式碼的人。然而,有時無論是否拋出異常,或程式執行流程是否成功完成,都需要執行某些操作,例如關閉檔案、資料庫連線等。

對於這些情況,使用finally 區塊。該區塊放置在 catch 區塊之後,或如果不使用 catch 區塊,甚至放置在 try 區塊之後。放置在finally區塊中的程式碼將在兩種情況下執行:

  • 當 try 區塊結束且沒有拋出異常時。
  • 當發生異常時,執行流程會被中斷,並執行catch區塊。

實施例1

讓我們考慮一個除法方法,它接收兩個整數並傳回它們之間除法的結果。它使用 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 區塊總是被執行。

實施例2

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
登入後複製
登入後複製

此範例中需要考慮的一些方面是:

  • reader 變數在 try 區塊之外聲明,以便可以從 finally 區塊存取它,即它在兩個區塊的範圍內。
  • 在嘗試關閉文件之前檢查 reader 變數是否不同於 null,因為如果無法開啟文件,則該變數將保持為 null,並在嘗試關閉文件時拋出異常。
  • 當嘗試關閉finally區塊中的檔案時,close方法可能拋出的可能異常不會被處理並在方法簽名中傳播,如果你想處理它,你可以將它包裝在try-catch中區塊位於finally 區塊內。

結論

finally 在 Java 中的使用已經變得如此普遍,以至於語言本身有一個替代方案可以讓我們簡化資源管理,即 try-with-resources 區塊。此區塊負責在資源使用結束時自動關閉資源,因此無需使用finally 區塊來釋放資源。但是,需要注意的是,finally 區塊在某些情況下仍然有用,並且兩個選項可以一起使用。

以上是Java中的finally區塊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板