2011-05-05 67 views
4

我有一個java應用程序,用戶可以通過運行java -jar app.jar或通過雙擊.jar文件從桌面環境從命令行調用。有沒有一種安全的編程方式來確定打開Swing窗口是否安全?

我希望應用程序能夠檢測它是否可以安全地啓動Swing GUI,或者它是否必須使用命令行界面。如果我只是在沒有檢查窗口系統可用性的情況下開始調用Swing函數,那麼Java會用一個InternalError進行保護。

舉例來說,如果我未設置DISPLAY和運行應用程序,我得到:

 
java.lang.InternalError: Can't connect to X11 window server using '' as the value of the DISPLAY variable. 
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) 
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:62) 
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:178) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:142) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:186) 
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82) 
    at sun.awt.X11.XToolkit.(XToolkit.java:112) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:186) 
    at java.awt.Toolkit$2.run(Toolkit.java:849) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:841) 
     [etc] 

我可能只是嘗試...趕上InternalError該並運行在這種情況下,命令行界面,但我d聽說不應該捕獲錯誤,因爲它們可能會使JVM處於不一致的狀態。 (請糾正我,如果我錯了。)

有沒有什麼辦法可以檢查我是否可以安全地打開Swing窗口而不捕獲InternalError? (我可以檢查顯示器的環境變量不爲空,但非空,顯示效果不能保證X服務器的實際工作,亦不會這種方法工作在非X11環境。)

+1

儘管您不應該捕獲'Error',但在這種特定情況下,可能會收到'InternalError'(僅限於非常有限的'catch'塊只調用'getDefaultToolkit()')。但是因爲有更好的解決方案('isHeadless()'),所以沒有必要。 – 2011-05-05 06:33:33

回答

3

我可以試試......在這種情況下捕獲InternalError並運行命令行界面,但我聽說不應該捕獲錯誤,因爲它們可能會使JVM處於不一致狀態。 (請糾正我,如果我錯了。)

你的理解是一半的權利。

錯誤並嘗試恢復/繼續運行是一個壞主意,因爲JVM可能(已經)處於無法恢復的狀態。

但是,捕獲特定的錯誤,向控制檯打印信息性診斷並立即退出JVM是一件非常安全的事情。 (System.out/err流對於導致Error被拋出的大多數東西都非常有彈性。)

在這種特殊情況下,可能無法恢復任何內容。因此,無論如何,救助是最明智的選擇。 (儘管在嘗試啓動GUI之前調用isHeadless()是個好主意。)

+0

謝謝!在我的情況下,因爲即使DISPLAY未設置(或設置爲假的東西,比如localhost:38219),isHeadless()也是false,我以這種方式捕獲錯誤並告訴用戶傳遞命令行參數來強制應用程序進入CLI模式。我寧願運行CLI模式,但如果在捕獲InternalError後JVM可能不安全,我會避免這種情況。 – Joe 2011-05-05 15:51:04

+0

這很有趣。根據這個 - http://bugs.gentoo.org/show_bug.cgi?id=361439#c2 - 如果DISPLAY未設置,isHeadless()應該可以工作......但是如果它設置爲假的。 – 2011-05-06 03:03:15

14
+1

希望你不要介意,增加一個鏈接。 – 2011-05-05 06:05:09

+0

打敗我吧。 :) – 2011-05-05 06:06:01

+0

您認爲'awt.GraphicsEnvironment.isHeadless()'是否也適用於支持SWT的應用程序? – 2011-05-05 06:36:03

相關問題