Java 是否有可能无法执行finally块?

Java 是否有可能无法执行finally块?,java,exception,Java,Exception,我们知道,无论是抛出异常,还是捕获并处理异常,finally块都会被执行,所以我很好奇finally块有没有不执行的可能性 如果在try或catch中调用System.exit(),那么在Java文档中也会调用finally?: 它最终解释得很好 他们注意到,如果JVM退出,则不会调用finally块。或者,如果运行代码块的线程被终止,则不会调用finally块。在所有其他情况下都是如此 如果JVM在执行try或catch代码时退出,则finally块可能不会执行。同样,如果执行try或cat

我们知道,无论是抛出异常,还是捕获并处理异常,finally块都会被执行,所以我很好奇finally块有没有不执行的可能性


如果在try或catch中调用System.exit(),那么在Java文档中也会调用finally?

它最终解释得很好

他们注意到,如果JVM退出,则不会调用finally块。或者,如果运行代码块的线程被终止,则不会调用finally块。在所有其他情况下都是如此

如果JVM在执行
try
catch
代码时退出,则
finally
块可能不会执行。同样,如果执行
try
catch
代码的线程被中断或终止,则即使整个应用程序继续运行,
finally
块也可能不会执行


来源:

我现在能想到的一件事是
OutOfMemoryError
,在这种情况下,应用程序中可能无法执行更多的代码

System.exit()
将阻止执行
finally
块。

如果某些Java本机接口方法发生故障(Java之外的库函数,但从那里调用的函数崩溃),也不会调用finally方法,因为整个JVM停止

JVM本身的错误也会导致崩溃,并阻止一切继续执行。

System.exit(1);你可以用

try {
    System.out.println("BEFORE");
    System.exit(0);
    System.out.println("AFTER");
} finally {
    System.out.println("FINALLY");
}
这将为您提供以下输出:

BEFORE

无论正常java程序流中是否出现异常,try-catch异常块中的finally子句始终执行。如果执行流在finally子句之前停止,那么finally块将不会执行


我们可以使用
System.exit(1)
在finally

之前阻塞并停止程序的执行流。

我能想到的另一种情况(从其他答案中忽略)是当
异常
finally
块中抛出时,在这种情况下
finally
块将不会“完全”执行。

注意“可能”如果你拔出电脑的插头,finally块将不会被执行。即使发生OutOfMemory错误,finally块也会被执行。当然,finally块本身的执行可能会导致OutOfMemoryError本身,但这也可能发生,即使try块成功完成。