我们知道无论是抛出异常,还是捕获和处理异常,finally块都会被执行,所以我很好奇有可能finally块不会被执行 .
如果在try或catch中调用System.exit(),那么finally也会被调用吗?
始终执行try-catch异常块中的finally子句,而不管普通java程序流中是否发生异常 . 如果在finally子句之前停止执行流程,则不会执行finally块 .
我们可以在最终阻止之前使用 System.exit(1); 并停止程序的执行流程 .
System.exit(1);
如果在执行try或catch代码时JVM退出,则finally块可能无法执行 . 同样,如果执行try或catch代码的线程被中断或终止,则即使应用程序作为一个整体继续,finally块也可能无法执行 .
资料来源:java.sun.com: Java Tutorial: The finally Block
System.exit() 将阻止 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 ,在这种情况下,您的应用程序中可能无法执行其他代码 .
OutOfMemoryError
System.exit(1);您可以使用
如果某些Java Native Interface方法是segfaults(java之外的库函数但是从那里调用崩溃),也不会调用finally方法,因为整个JVM都会停止 .
JVM本身的错误也会导致崩溃并阻止一切继续执行 .
8 回答
始终执行try-catch异常块中的finally子句,而不管普通java程序流中是否发生异常 . 如果在finally子句之前停止执行流程,则不会执行finally块 .
我们可以在最终阻止之前使用
System.exit(1);
并停止程序的执行流程 .资料来源:java.sun.com: Java Tutorial: The finally Block
System.exit()
将阻止finally
块执行 .在Java文档中:
http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html
最后解释得非常好 .
他们注意到如果JVM退出,则不会调用finally块 . 或者,如果正在运行代码块的线程被终止,则不会调用finally块 . 在所有其他情况下,它会 .
这会给你输出:
我现在能想到的一件事是
OutOfMemoryError
,在这种情况下,您的应用程序中可能无法执行其他代码 .System.exit(1);您可以使用
如果某些Java Native Interface方法是segfaults(java之外的库函数但是从那里调用崩溃),也不会调用finally方法,因为整个JVM都会停止 .
JVM本身的错误也会导致崩溃并阻止一切继续执行 .