我们知道无论是否抛出异常,或者异常被捕获和处理掉了,finally代码块都会被执行。所以我很好奇是否存在finally代码块不会被执行的情况。
如果在try或catch中调用System.exit(),那么finally代码块会被执行吗?
如果在try或catch中调用System.exit(),那么finally代码块会被执行吗?
try
或catch
代码时JVM退出,那么finally
块可能不会执行。同样,如果执行try
或catch
代码的线程被中断或终止,则finally
块可能不会执行,尽管整个应用程序仍在继续运行。System.exit()
会阻止finally
块的执行。
try {
System.out.println("BEFORE");
System.exit(0);
System.out.println("AFTER");
} finally {
System.out.println("FINALLY");
}
BEFORE
http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html
它很好地解释了finally。我现在能想到的一件事是OutOfMemoryError
,在这种情况下,你的应用程序可能无法执行任何进一步的代码。
System.exit(1); 你可以使用
我能想到的另一种情况(其他答案中没有提到)是当 finally
块内抛出一个 exception
时,finally
块将不会被完全执行。
在 try-catch 异常块中,finally 子句总是执行,无论在正常的 Java 程序流程中是否发生异常。如果在 finally 子句之前停止执行流,则 finally 块将不会被执行。
我们可以在 finally 块之前使用 System.exit(1);
来停止程序的执行流程。