你能在异常类中调用System.exit()吗?

时间:2013-05-02 09:20:56

标签: java exception

我有一些调用自定义异常的代码。但是,当达到此异常时,它会导致我的程序挂起。我想要的是当这个异常发生时,我的程序完全停止运行,因为这是一个不可恢复的位置。

所以我的问题是:在我的异常类的构造函数中调用System.exit(1)是不好的做法吗?或者我应该从抛出异常的代码中调用它?

6 个答案:

答案 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())。