2012-12-07 48 views
5

如果在java中執行關閉鉤子期間引發未捕獲的異常,請立即退出jvm而不運行剩下的註冊關閉鉤子(如果有的話) ?從的javadoc:當java中的關閉鉤子引發異常時會發生什麼

捕獲的異常在關閉掛鉤處理,就像任何其他 線程,通過調用線程的線程組 對象的uncaughtException方法。此方法的默認實現將 異常的堆棧跟蹤打印到System.err並終止該線程; 它不會導致虛擬機退出或暫停。

好像其他關閉掛鉤應該運行...

作爲後續行動的問題,它可能不是一個好主意,有一段代碼,可能會拋出異常的關閉掛鉤?如果你無法避免它,嘗試捕獲關閉鉤子中的異常是否是一個好習慣?

回答

5

由於addShutdownHook方法需要一個線程,每個單獨的關閉鉤子是它自己的線程。未捕獲異常的默認行爲是打印錯誤消息並終止線程。由於掛鉤具有相同的行爲,以錯誤結尾的單個關閉掛鉤不應阻止其他人運行。

請注意,我還沒有真正測試過這個...

+1

謝謝!我已經測試過這種行爲,你是對的,在特定的關閉鉤子中的異常並不妨礙其他鉤子運行。 –

1

在關閉鉤子中運行的代碼與在主線程中運行的代碼一樣受最佳實踐的約束:如果需要,可以捕獲異常,如果需要可以記錄,或者讓異常僅打印到stdout。

+0

啊,這是有道理的。 –

相關問題