有没有办法让我的java应用程序关闭有错误?例如如果我有一个nullpointerexception,我可以让它完全关闭吗?
答案 0 :(得分:3)
顶级任何未捕获的异常都会自动停止它所在的线程。如果程序中有多个线程,其他线程仍然存在。如果您想明确终止,可以致电System.exit()
答案 1 :(得分:1)
您可以使用System.exit(0);
来终止JVM。
但是,您应该在使用之前检查引用来避免NullPointerException
:
if(foo != null) foo.doSomething();
答案 2 :(得分:1)
正如其他人所说,捕获异常并调用System.exit()
(通常)是正确的方法。但除此之外还有更多:
答:如果您的应用程序是传统的命令行应用程序,并且在“主”线程上抛出异常,那么您可能不需要捕获它。主线程上未捕获的异常将导致应用程序退出...如果没有其他非守护程序线程存在。 (事实上,任何线程......)
也是如此但是,如果您的线程有多个非守护程序线程,那么您需要做一些事情来停止该应用程序。喜欢捕获异常并调用exit()
。
答:在可能抛出“致命”异常的任何线程的堆栈上。有两种方法可以做到这一点:
在main(String[])
方法中使用try / catch(Throwable),一个线程的run()
方法,等等。
安装默认的未捕获异常处理程序。
您不想做的是在代码库中添加System.exit()
次调用。这种方法会导致各种问题,包括可重用性,单元测试以及通常会搞清楚“为什么 ecing 应用程序再次死亡”。
答:您的应用程序可能无法自然退出的一个原因是您的代码已经意外地捕获了异常。例如:
try {
doSomething()
} catch (Exception ex) {
handle an IO exception
}
在上面,一些无知/懒惰的程序员并没有费心去考虑doSomething
中可能抛出的异常,并假设它们都是某种与IO相关的异常。但是,如果异常实际上是一个意外的NullPointerException
......或更糟糕的事情......那么代码就会压扁它。
这种事情的治疗方法是代码审查和指导,以治愈程序员的坏习惯...希望在他对代码库造成太大损害之前!如果你在你的代码库中发现了这种东西,你应该立即修复它......并且可能会对类似事件“grep”并修复它们。