有没有一种安全,可编程的方法来确定打开Swing窗口是否安全?

我有一个用户可以通过运行java -jar app.jar从命令行调用的java应用程序,或者通过双击.jar文件从桌面环境调用。

我希望该应用程序能够检测它是否可以安全地启动Swing GUI或者是否必须使用命令行界面。 如果我只是在不检查窗口系统可用性的情况下开始调用Swing函数,那么Java就会出现InternalError错误。

例如,如果我取消设置DISPLAY并运行应用程序,我得到:

 java.lang.InternalError:无法使用''作为DISPLAY变量的值连接到X11窗口服务器。
     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)
    在sun.awt.X11GraphicsEnvironment。(X11GraphicsEnvironment.java:142)
     at java.lang.Class.forName0(Native Method)
    在java.lang.Class.forName(Class.java:186)
     at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    在sun.awt.X11.XToolkit。(XToolkit.java:112)
     at java.lang.Class.forName0(Native Method)
    在java.lang.Class.forName(Class.java:186)
    在java.awt.Toolkit $ 2.run(Toolkit.java:849)
     at java.security.AccessController.doPrivileged(Native Method)
    在java.awt.Toolkit.getDefaultToolkit(Toolkit.java:841)
         [等等]

我可以尝试…捕获InternalError并在这种情况下运行命令行界面,但我听说不应该捕获错误,因为它们可能会使JVM处于不一致状态。 (如果我错了,请纠正我。)

有什么方法可以检查我是否可以安全地打开Swing窗口而不会捕获InternalError? (我可以检查DISPLAY环境变量是否为空,但是非空的DISPLAY不能保证X服务器实际工作。这种方法也不适用于非X11环境。)

我可以尝试…捕获InternalError并在这种情况下运行命令行界面,但我听说不应该捕获错误,因为它们可能会使JVM处于不一致状态。 (如果我错了,请纠正我。)

你的理解是对的。

捕获错误并尝试恢复/继续运行是一个坏主意,因为JVM可能(已经)处于无法进行恢复的状态。

但是,捕获特定错误,向控制台打印信息性诊断并立即退出JVM是一件非常安全的事情。 (System.out / err流对大多数导致抛出Error事物非常有弹性。)

在这种特殊情况下,你可能无法恢复。 无论如何,拯救是最明智的选择。 (在尝试启动GUI之前调用isHeadless()是一个更好的主意。)

你可以使用GraphicsEnvironment.isHeadless()