【问题标题】:Can you catch a "package x does not exist" error in Java?你能在 Java 中捕捉到“包 x 不存在”错误吗?
【发布时间】:2021-08-03 03:06:57
【问题描述】:

我正在使用 this code 设置我的 JavaFX 应用程序的 macOS 停靠图标:

try {
    // Sets macOS dock icon:
    com.apple.eawt.Application.getApplication().setDockIconImage(SwingFXUtils.fromFXImage(appIcon, null));
} catch (Exception e) {
    // Doesn’t work on Windows and Linux
}

我无法在 Windows 上运行该应用程序,因为它会引发错误“java: com.apple.eawt 包不存在”

如何在运行时捕获“包 x 不存在”错误或检查它是否存在?

【问题讨论】:

  • 反射可以捕捉到这个
  • Class.forName("com.apple.eawt.Application"); 放在 try 块的开头,并捕获 ClassNotFoundException 或 ReflectiveOperationException。

标签: java windows macos javafx error-handling


【解决方案1】:

您可以尝试事先了解您当前的操作系统是什么。基本上有两种方式。 System.getProperty("os.name")SystemUtils.OS_NAME 来自 Apache Commons Lang。

另请参阅:https://www.baeldung.com/java-detect-os

【讨论】:

    【解决方案2】:

    你不能 - 这是一个编译器错误,你无法在运行时捕获它们。但是“如果类存在,我可以运行此代码,否则不运行它”的概念 - 是的,您可以这样做,您只需要使用反射,这基本上会将编译时的东西变成运行时的东西:

    public boolean trySetMacOsDockIcon(Image img) {
      try {
       Class<?> c = Class.forName("com.apple.eawt.Application");
       Method m = c.getMethod("getApplication");
       Object application = m.invoke(null);
       m = application.getClass().getMethod("setDockIconImage", Image.class);
       m.invoke(application, img);
       return true;
      } catch (Exception e) {
       return false;
      }
    }
    

    您可能希望记录这些异常,至少在您测试过一次或两次之前。

    m.invoke(null) 调用方法;第一个参数是“接收者”(点左边的东西);对于静态方法,没有接收者并且参数不做任何事情。 getApplication 是静态的,所以我们在那里传递 null。第二行invoke是苹果Application类的一个实例方法,所以我们需要传入一个值,即调用getApplication得到的应用对象。第二个参数只是该方法的参数,因此,我们传递图像。

    【讨论】:

    • 您还可以在运行时捕获 java 中的链接器错误(捕获 Error 的子类型)。这当然需要编译实际工作。但最有可能使用反射访问更灵活,因为它允许代码以更少的依赖项进行编译(但您仍然需要平台提供包来实际测试它,所以小心使用这些东西总是一个好主意)。当您在不同的平台上运行它时,最好有一个备用解决方案。
    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    相关资源
    最近更新 更多