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

时间:2010-03-10 15:11:01

标签: java exception

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

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

9 个答案:

答案 0 :(得分:21)

  

如果在执行trycatch代码时JVM退出,则finally块可能无法执行。同样,如果执行trycatch代码的线程被中断或终止,即使应用程序作为一个整体继续,finally块也可能无法执行。

来源:java.sun.com: Java Tutorial: The finally Block

答案 1 :(得分:6)

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

答案 2 :(得分:3)

在Java文档中:

http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html

最后解释得非常好。

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

答案 3 :(得分:3)

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

这会给你输出:

BEFORE

答案 4 :(得分:2)

我现在能想到的一件事是OutOfMemoryError,在这种情况下,您的应用中可能无法再执行其他代码。

答案 5 :(得分:1)

System.exit(1);你可以用

答案 6 :(得分:0)

如果某些Java Native Interface方法是segfaults(java之外的库函数但是从那里调用崩溃),也不会调用finally方法,因为整个JVM都会停止。

JVM本身的错误也会导致崩溃并阻止所有内容继续执行。

答案 7 :(得分:0)

try-catch异常块中的finally子句总是执行,而不管普通java程序流中是否发生异常。如果执行流程在finally子句之前停止,那么finally块将不会被执行。

我们可以在最终阻止并停止程序的执行流程之前使用System.exit(1);

答案 8 :(得分:0)

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