你能在 Java 中捕捉到 "package x does not exist" 错误吗?

Can you catch a "package x does not exist" error in Java?

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

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 不存在”错误或检查它是否存在?

您可以尝试先了解一下您当前的 OS 是多少。基本上有两种方法。来自 Apache Commons Lang 的 System.getProperty("os.name")SystemUtils.OS_NAME

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

你不能 - 这是一个编译器错误,你无法在运行时捕获它们。但是 'can I run this code if the class is there, but not run it otherwise' 的概念 - 是的,你可以做到这一点,你只需要使用反射,它基本上将编译时的东西变成运行时的东西:

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) 调用方法;第一个参数是 'receiver' (点左边的东西);对于静态方法,没有接收者并且参数不做任何事情。 getApplication 是静态的,所以我们在那里传递 null 。第二invoke行是apple的Applicationclass上的一个实例方法,所以这里需要传入一个值,即我们调用getApplication得到的application对象。第二个参数只是该方法的参数,因此,我们传递图像。