我有一些调用自定义异常的代码。但是,当达到此异常时,它会导致我的程序挂起。我想要的是当这个异常发生时,我的程序完全停止运行,因为这是一个不可恢复的位置。
所以我的问题是:在我的异常类的构造函数中调用System.exit(1)是不好的做法吗?或者我应该从抛出异常的代码中调用它?
答案 0 :(得分:2)
是在System.exit(1)
类的构造函数中调用Exception
是 BAD练习。
在场景中,这是一个不可恢复的 Exception
。理想情况下,它应该是Error
而不是Exception
。
我是否应该从抛出异常的代码中调用它?
否如果它是Exception
并且仅在您需要退出应用程序的情况下,您应该抛出 Exception
然后抓住它并且在catch
块中,您可以exit
申请。
答案 1 :(得分:1)
这里有很多回复,但让我再分享一下。 现在调用exit
只是一个临时的 解决方案。有一天,为了继续前进,你将不得不处理这个问题。
最近,我参与了一个具有本机调用的应用程序,并且JVM会在一个特定的场景中崩溃。执行System.exit
暂时有效,但除非根本原因未解决,否则应用程序可能不健壮
所以你现在应该看看原因而不是简单的意思:)
答案 2 :(得分:0)
从代码中调用System.exit(1)
将比从构造调用更好地退出系统的当前执行
你为什么打电话给System.exit(1)
。最好的是catch
exception
并通过流程以编程方式退出应用程序。
答案 3 :(得分:0)
我有一些调用自定义异常的代码。
但是,当达到此异常时,它会导致我的程序挂起。
我想要的是当发生此异常时我的程序完全停止运行,因为这是一个不可恢复的位置。
所以我的问题是:在我的异常类的构造函数中调用System.exit(1)是不好的做法吗?或者我应该从抛出异常的代码中调用它?
答案 4 :(得分:0)
是的,不推荐。
因为System.exit方法永远不会正常返回。一旦一个线程进入那里,它就不会回来。它用于在程序退出之前运行关闭钩子。
恕我直言只需抓住您的例外并关闭该计划。
http://docs.oracle.com/javase/1.5.0/docs/guide/lang/hook-design.html
答案 5 :(得分:0)
如果未捕获异常,它应该一直向上传播调用堆栈,直到它导致JVM终止应用程序。如果你的情况没有发生,那么其他问题也就错了。
可能性1:正如@rahul所描述的,如果它是一个不可恢复的解决方案,那么您的自定义“异常”应该是Error
的子类。这样,它将不受阻碍地通过所有表现良好的捕获块。
可能性2:异常被抛入一个单独的线程中。在这种情况下,异常只会沿着Thread的堆栈帧向上传播,默认情况下不会影响主程序。如果您正在使用框架,它至少应报告该错误(因此您可以诊断问题)。如果您自己创建线程,则可以自己添加一些正确的catch
子句(例如,调用System.exit()
)。