2011-11-22 20 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關閉時,您的關閉鉤子將在單獨的線程中運行您的可運行邏輯。你無法做更多的事情。

相關問題