簡體   English   中英

System.exit(1) 的替代方案

[英]Alternatives to System.exit(1)

由於各種原因,在編寫Java ApplicationsSystem.exit調用System.exit ,那么我如何通知調用進程並非一切都按計划進行?

編輯: 1 是任何非零退出代碼的standin

采用System.exit當“應用”確實是一個較大的Java應用程序(服務器)的一個子應用程序(如小服務程序,小應用程序)是不可取的:在這種情況下, System.exit會停止JVM,因此也都其他子應用程序。 在這種情況下,拋出一個可以被應用程序框架/服務器捕獲和處理的適當異常是最好的選擇。

如果 Java 應用程序真的打算作為獨立應用程序運行,那么使用System.exit沒有任何問題。 在這種情況下,設置退出值可能是向父進程傳達失敗或成功的最簡單(也是最常用)的方式。

我同意“拋出異常”的人群。 一個原因是,如果您希望其他代碼能夠使用它,調用 System.exit 會使您的代碼難以使用。 例如,如果您發現您的類在 Web 應用程序或某種消息消費應用程序中很有用,那么讓這些容器有機會以某種方式處理失敗會很好。 容器可能想要重試操作、決定記錄並忽略問題、向管理員發送電子郵件等。

一個例外是您的main()方法; 這可能會捕獲異常,並使用一些可以被調用進程或 shell 腳本識別的值調用System.exit()

System.exit()將阻塞,如果啟動它的線程在關閉鈎子中使用,則會創建一個死鎖。

我們公司的政策是可以(甚至更喜歡)調用 System.exit(-1),但只能在 init() 方法中。 在程序的正常流程中調用它之前,我肯定會三思而后行。

我認為拋出異常是出現問題時應該做的事情。 這樣,如果您的應用程序不是作為獨立應用程序運行的,則調用者可以對其做出反應並獲得一些有關出錯的信息。 出於調試目的也更容易,因為當您看到堆棧跟蹤時,您也可以更好地了解出了什么問題。

需要注意的一件重要事情是,當異常到達頂層並因此導致 VM 退出時,VM 會返回返回碼 1,因此使用該返回碼的外部應用程序會發現出現問題。

我認為 System.exit() 有意義的唯一情況是當您的應用程序打算由非 Java 應用程序調用時,因此必須使用返回碼來查看您的應用程序是否正常工作,並且您希望這些應用程序具有有機會對不同的錯誤做出不同的反應,即您需要不同的返回代碼。

在 web servlet 環境中它也可能是危險的/有問題的。

拋出異常通常被認為是另一種選擇。

拋出異常是將有關某個錯誤的信息向上和向外發送到應用程序的最佳方式。

一個數字不會告訴你那么多:

Exception at thread 'main': FileNotFoundException "The file 'foo' doesn't exist"

(或接近的東西)

它不贊成正常退出。 如果“並非一切都按計划進行”,那么 System.exit 就可以了。

更新:我應該補充一點,我假設您的 '1' 的含義已記錄在某處。

我也覺得有必要加一些我的鹽。 這是一個很好的問題,在我編寫應用程序時總是會彈出。

正如這里的每個人似乎都同意的那樣,您應該小心使用System.exit() ,如果可能,請使用異常。 但是, System.exit()似乎仍然是將基本信息返回給系統的唯一方法,因此如果您想讓您的應用程序可編寫腳本,則是必需的。 如果您不需要它,只需拋出異常並完成它。

但是如果(且僅當)您的應用程序是單線程的,那么使用它就可以了——它可以保證沒有其他東西進入,並且沒有資源打開(至少如果您一直使用try-with-resource成語,我強烈推薦它,因為它也使代碼更簡潔、更緊湊)。

另一方面,只要您的應用程序創建任何類型的可能寫入資源的線程, System.exit() 就完全是“不,不”,因為它可以(並且隨着時間的推移會)破壞數據。

為了能夠使用多線程和腳本化應用程序並仍然保證數據完整性,到目前為止我最好的解決方案是保存您創建的任何資源修改線程(例如,通過始終使用工廠方法將線程添加到列表中),並安裝一個關閉鈎子,通過中斷和加入它來干凈地結束每個線程。 由於關閉鈎子也被System.exit()調用,這將保證(減去編程錯誤)在中間資源寫入中沒有線程被殺死。

哦,是的,也許我什至不應該提及它,但是:永遠,永遠,使用那種可怕的System.halt()方法。 它只是在頭部射擊 VM 並且不調用任何關閉鈎子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM