有没有办法让我的java应用程序出现错误关闭?例如,如果我有一个空指针异常,我可以让它完全关闭吗?
3 回答
顶层任何未捕获的异常都会自动停止它所在的线程。如果程序中有多个线程,其他线程仍将继续存在。如果要显式终止,可以调用System.exit()
正如其他人所说,捕获异常并调用System.exit()
是(通常)正确的方法。但不仅如此:
问:我真的需要抓住它吗?
A:如果您的应用程序是常规的命令行应用程序,并且在“主”线程上抛出异常,那么您可能不需要捕获它。主线程上未捕获的异常将导致应用程序退出......如果不存在其他非守护线程。(事实上,同样的事情适用于任何线程......)
但是,如果您的线程有多个非守护线程,那么您需要做一些事情来停止应用程序。就像捕获异常并调用exit()
.
问:你在哪里抓到的?
答:在可能引发“致命”异常的任何线程的堆栈上。有两种方法可以做到这一点:
main(String[])
在方法、线程的方法等中放置一个 try/catch(Throwable)run()
。安装默认的未捕获异常处理程序。
你不想做的是System.exit()
通过你的代码库添加调用。这种方法会导致可重用性、单元测试以及通常弄清楚“为什么effing应用程序又死了”的各种问题。
问:如果已经被抓到了怎么办?
答:您的应用程序可能无法自然退出的一个原因是您的代码已经意外地捕获了异常。例如:
try {
doSomething()
} catch (Exception ex) {
handle an IO exception
}
在上面,一些无知/懒惰的程序员没有考虑可能抛出的异常,doSomething
并认为它们都是某种与 IO 相关的异常。但是,如果异常实际上是意外NullPointerException
......或者更糟糕的......那么代码只是将它压扁了。
解决这种问题的方法是代码审查和指导,以治愈程序员的坏习惯……希望在他对代码库造成太大破坏之前!如果你在你的代码库中发现这种东西,你应该立即修复它......并且可能对类似事件进行“grep”并修复它们。
您可以使用System.exit(0);
来终止 JVM。
NullPointerException
但是,您应该在使用它之前通过检查参考来避免:
if(foo != null) foo.doSomething();