一个finally块有可能不会被执行吗?

10
我们知道无论是否抛出异常,或者异常被捕获和处理掉了,finally代码块都会被执行。所以我很好奇是否存在finally代码块不会被执行的情况。
如果在try或catch中调用System.exit(),那么finally代码块会被执行吗?

10
如果你拔掉电脑的插头,finally块将不会执行。 - Fortega
9个回答

25
如果在执行trycatch代码时JVM退出,那么finally块可能不会执行。同样,如果执行trycatch代码的线程被中断或终止,则finally块可能不会执行,尽管整个应用程序仍在继续运行。
来源:java.sun.com:Java教程:finally块

1
请注意,“may”这个词。 - setzamora

7

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


3
try {
    System.out.println("BEFORE");
    System.exit(0);
    System.out.println("AFTER");
} finally {
    System.out.println("FINALLY");
}

这将会给你输出:
BEFORE

3

3

我现在能想到的一件事是OutOfMemoryError,在这种情况下,你的应用程序可能无法执行任何进一步的代码。


即使发生OutOfMemoryError,finally块也会被执行。当然,finally块本身的执行可能会导致OutOfMemoryError,但即使try块成功完成,这种情况也可能发生。 - jarnbjo

1

System.exit(1); 你可以使用


1

我能想到的另一种情况(其他答案中没有提到)是当 finally 块内抛出一个 exception 时,finally 块将不会被完全执行。


0

在 try-catch 异常块中,finally 子句总是执行,无论在正常的 Java 程序流程中是否发生异常。如果在 finally 子句之前停止执行流,则 finally 块将不会被执行。

我们可以在 finally 块之前使用 System.exit(1); 来停止程序的执行流程。


0
如果一些Java Native Interface方法发生段错误(从Java调用的库函数崩溃),那么finally方法也不会被调用,因为整个JVM都会停止。
JVM本身的错误也会导致崩溃,并阻止继续执行所有操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接