0

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

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

4

6 回答 6

2

的,调用类的构造函数是一种不好的做法System.exit(1)Exception

在 Scenario 中,这是一个不可恢复 Exception的. 理想情况下,它应该是 aError而不是Exception.

我应该从引发异常的代码中调用它吗?

不,如果它是一个Exception并且仅在您需要退出应用程序的情况下,您应该抛出然后Exception捕获并在catch块中您可以exit应用程序。

于 2013-05-02T09:25:28.380 回答
1

这里有很多回应,但让我再分享一件事。现在打电话exit只是一个临时解决方案。总有一天,要继续前进,您将不得不处理这个问题。

最近,我参与了一个具有本机调用的应用程序,并且 JVM 在一个特定场景中会崩溃。做System.exit临时工作,但除非根本原因没有解决,否则应用程序不能健壮

所以你现在应该看看原因而不是简单的意思:)

于 2013-05-02T09:32:18.457 回答
0

如果没有捕获到异常,它应该一直向上传播到调用堆栈,直到它导致 JVM 终止应用程序。如果您的情况没有发生这种情况,则说明其他问题。

可能性 1:如@rahul 所述,如果它是一个不可恢复的解决方案,您的自定义“异常”应该是子类Error。这样,它将不受阻碍地通过所有表现良好的 catch 块。

可能性2:在单独的线程中抛出异常。在这种情况下,异常只会沿着该线程的堆栈帧向上传播,默认情况下不会影响主程序。如果您使用的是框架,它至少应该报告该错误(以便您可以诊断问题)。如果您自己创建线程,您可以自己添加一些适当的catch子句(例如调用System.exit())。

于 2013-05-02T09:33:23.790 回答
0

我有一些调用自定义异常的代码。

  • 你不调用异常你只是抛出一个异常。很好,你正在处理和投掷。

但是,当遇到此异常时,它会导致我的程序挂起。

  • 你的异常类中的代码也有问题。你必须处理它。

我想要的是当这个异常发生时我的程序完全停止运行,因为这是一个不可恢复的位置。

  • 然后你不应该抛出自定义异常,记录原因并退出。

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

  • 见之前的回复。
于 2013-05-02T09:28:49.270 回答
0

是的,不推荐。

因为 System.exit 方法永远不会正常返回。一旦一个线程去那里,它就不会回来。它用于在程序退出之前运行关闭挂钩。

恕我直言,只需捕获您的异常并关闭程序。

http://docs.oracle.com/javase/1.5.0/docs/guide/lang/hook-design.html

于 2013-05-02T09:31:18.487 回答
0

从代码调用System.exit(1)将退出系统的当前执行可能比从构造调用更好。
你为什么打电话System.exit(1)。最好是catchexception应用程序通过流程以编程方式退出。

于 2013-05-02T09:23:58.593 回答