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