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 程式碼塊總是會執行。但是,我們可以建立一些情況來限制其執行。在這篇文章中,我們透過示例程式分享了兩種這樣的場景。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP