【发布时间】:2011-01-25 22:53:14
【问题描述】:
我们知道,无论是抛出异常,还是捕获并处理异常,finally块都会被执行,所以我很好奇finally块有没有可能不执行。
如果 System.exit() 在 try 或 catch 中被调用,那么 finally 也会被调用吗?
【问题讨论】:
-
如果你拔掉电脑的插头,finally块不会被执行。
我们知道,无论是抛出异常,还是捕获并处理异常,finally块都会被执行,所以我很好奇finally块有没有可能不执行。
如果 System.exit() 在 try 或 catch 中被调用,那么 finally 也会被调用吗?
【问题讨论】:
如果在执行
try或catch代码时JVM 退出,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally块也可能不会执行。
【讨论】:
System.exit() 将阻止 finally 块执行。
【讨论】:
在 Java 文档中:
http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html
它解释得很好。
他们确实注意到,如果 JVM 退出,finally 块将不会被调用。或者,如果正在运行代码块的线程被杀死,finally 块将不 被调用。在所有其他情况下,它都会。
【讨论】:
try {
System.out.println("BEFORE");
System.exit(0);
System.out.println("AFTER");
} finally {
System.out.println("FINALLY");
}
这会给你输出:
BEFORE
【讨论】:
我现在能想到的一件事是OutOfMemoryError,在这种情况下,您的应用程序中可能无法执行更多代码。
【讨论】:
System.exit(1);你可以使用
【讨论】:
如果某些 Java Native Interface 方法出现段错误(java 外部的库函数但从那里调用崩溃),由于整个 JVM 停止,finally 方法也不会被调用。
JVM 本身的错误也会导致崩溃并阻止一切继续执行。
【讨论】:
try-catch 异常块中的 finally 子句始终执行,无论在正常的 java 程序流中是否发生异常。如果在 finally 子句之前停止执行流程,那么 finally 块将不会被执行。
我们可以在finally之前使用System.exit(1);来阻塞并停止程序的执行流程。
【讨论】:
我能想到的另一种情况(其他答案中忽略了)是exception 被扔进finally 块内,在这种情况下finally 块不会是 "完全”执行。
【讨论】: