你能在 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
。
你不能 - 这是一个编译器错误,你无法在运行时捕获它们。但是 '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对象。第二个参数只是该方法的参数,因此,我们传递图像。
我正在使用 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
。
你不能 - 这是一个编译器错误,你无法在运行时捕获它们。但是 '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对象。第二个参数只是该方法的参数,因此,我们传递图像。