2011-11-22 67 views
3

如果我有一个Java程序,可以退出因各种原因,如:查找,从ShutdownHook,为什么一个程序退出

  • 因为主窗口中,它被设置在接近“退出”,被关闭

  • ,因为有一些System.exit(0)代码

  • 因为有根本没有更多的窗口(并没有被设置为关闭退出上),但仍然有几个线程然后在一个点运行,只有守护线程正在运行,因此该程序退出。

而且我已经安装了关机挂钩(它运行正常)。

有没有什么办法可以从我的shutdown hook中知道是什么导致Java程序退出?

(请注意,我不问,如果它是一个好主意或不具有System.exit(...)遍布代码库:这是不是这个问题是关于什么的)

基本上我想知道我强迫自己拦截每一个可能的JVM退出点,并在那里添加信息,或者如果已经有一种方法允许这样做。

回答

4

您可以添加一个将在系统退出时调用的SecurityManager(以确定它是否允许)。您可以保存稍后调用的地方或在SecurityManager中处理它。

+0

你是什么意思*“你可以保存这个以后要求的地方......”* * SecurityManager *会让我得到确切的类/行,例如,一个* System.exit *打电话了? –

+2

您可以使用Thread.currentThread()。getStackTrace()获取堆栈跟踪。 SecurityManager在执行安全敏感操作时被调用(否则它只是一个类/对象) –

+0

在安全管理器内部,可以构造一个'Throwable',然后使用'printStackTrace()'或'getStackTrace ()'。 –

-1

当JVM关闭时,您的关闭钩子将在单独的线程中运行您的可运行逻辑。你无法做更多的事情。

相关问题