我们知道无论是抛出异常,还是捕获和处理异常,finally块都会被执行,所以我很好奇有可能finally块不会被执行。
如果在try或catch中调用System.exit(),那么finally也会被调用吗?
答案 0 :(得分:21)
如果在执行
try
或catch
代码时JVM退出,则finally
块可能无法执行。同样,如果执行try
或catch
代码的线程被中断或终止,即使应用程序作为一个整体继续,finally
块也可能无法执行。
答案 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
块将不会“完全”执行。