Java 中的 finally 程式碼塊是否存在不執行的情況?


與 Java 異常處理相關的題目在許多公司的面試和考試中都非常常見。面試官可能會問的一個問題是:Java 中的 finally 程式碼塊是否存在不執行的情況?我們將嘗試以最簡單的方式找到這個問題的答案。一般來說,finally 程式碼塊的設計目的是無論 try-catch 程式碼塊中是否丟擲異常,它都一定會執行。

Java 中的 finally 程式碼塊是否存在不執行的情況?

在討論這個問題之前,有必要先了解一下 Java 異常處理。

Java 中的異常處理

在 Java 中,異常是一個表示錯誤的物件。發生的錯誤會中斷程式碼塊的正常執行流程,這就是我們需要處理這些異常的原因。處理這些意外錯誤的機制稱為異常處理。

常見的異常包括 ClassNotFoundException、FileNotFoundException、IOException 等等。

異常處理機制使用以下五個內建關鍵字:

  • try − 包含可能引發異常的程式碼塊。

  • catch − 用於處理 try 程式碼塊丟擲的異常。

  • throw − 用於顯式丟擲一個異常。

  • throws − 可以丟擲多個異常。

  • finally − 包含必須執行的關鍵程式碼塊。

try 程式碼塊可能的組合:

  • try-catch

  • try-finally

  • try-catch-finally

示例

下面的例子展示了 try、catch 和 finally 程式碼塊的實際應用。(此處應插入程式碼示例)

public class Finally {
   public static void main(String[] args) {
      try { // declaring try block
         System.out.println("Execution of Try block");
      } catch(Exception exp) { // defining catch block
         System.out.println(exp);
      }
      finally { // declaring finally block
         System.out.println("Execution of finally block");	
      }
   }
}

輸出

Execution of Try block
Execution of finally block

在上面的程式碼中,我們可以看到 try 和 finally 程式碼塊被執行了,但是 catch 程式碼塊沒有被執行。

finally 程式碼塊

前面的例子顯示了無論是否發生異常,finally 程式碼塊都會執行。但是,也存在一些情況下 finally 程式碼塊可能不會執行。

finally 程式碼塊可能不執行的情況

  • 在 try 或 catch 程式碼塊中呼叫 System.exit() 時。

  • 當 JVM 遇到非終止程式碼時。

讓我們用例子來理解這些點。

示例

在這個例子中,我們將在 try 程式碼塊中呼叫 System.exit() 來阻止 finally 程式碼塊的執行。當 JVM 遇到 System.exit() 時,程式將從該點終止,因此 finally 程式碼塊將不會執行。(此處應插入程式碼示例)

public class Finally {
   public static void main(String[] args) {
      try { // declaring try block
         System.out.println("Execution of Try block");
         System.exit(0); // to terminate the program
      } catch(Exception exp) { // defining catch block
         System.out.println(exp);
      }
      finally { // declaring finally block
         System.out.println("Execution of finally block");	
      }
   }
}

輸出

Execution of Try block

示例

在下面的例子中,我們在 try 程式碼塊中使用一個布林值為 true 的 while 迴圈,這將建立一個無限迴圈。這種情況將阻止 finally 程式碼塊的執行。(此處應插入程式碼示例)

public class Finally {
   public static void main(String[] args) {
      try { // declaring try block
         while (true) { // infinite loop
            // intentionally left blank
         }
      } catch(Exception exp) { // defining catch block
         System.out.println(exp);
      }
      finally { // declaring finally block
         System.out.println("Execution of finally block");	
      }
   }
}

上面的程式碼不會產生任何輸出。

結論

從上面的討論中,我們可以得出結論:通常情況下,finally 程式碼塊總是會執行。但是,我們可以建立一些情況來限制其執行。在這篇文章中,我們透過示例程式分享了兩種這樣的場景。

更新於:2023年8月10日

1000+ 瀏覽量

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.