我有点困惑。我有一个我正在研究的JavaFX程序(爱好),它在我的Mac上构建并运行得很好。 (我有最新的Oracle Java 7)。当我运行在Mac上构建的jar文件(在最新的NetBeans中),在我的32位Linux系统上(也使用最新的Oracle版本)时,它给出了以下错误:
java.lang.reflect.InvocationTargetException
file:/home/me/aFolder/SomeOne/Saved/Something.jar!/Something/mainWindow.fxml
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2186)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2744)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2723)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2709)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2696)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2685)
at Something.Something.start(Something.java:33)
at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82)
at java.lang.Thread.run(Unknown Source)
Something.java:33的行是我调用的地方
AnchorPane mainWindowPane =
(AnchorPane)FXMLLoader.load(UdoMail.class.getResource("mainWindow.fxml"));
所以,我很困惑从哪里开始。这是一个在我的Mac上构建的jar文件,移动到32位Linux(运行最新的32位Oracle Java),然后运行。
更奇怪的是,如果我在32位Linux上构建它,然后在我的Mac上运行Linux内置的jar文件,我会在Mac上(有效地)得到相同的错误。
如果我在我构建的同一平台上运行,一切正常。 (也就是说,如果我在Linux上使用代码并在Linux上构建代码,它在Linux上运行完美,但在Mac上运行不正确。)
由于我似乎无法在Linux上为Mac构建的jar文件运行调试器(反之亦然),所以我对于从何处开始寻找感到有点迷茫。我已经确保我正在使用File.separator并寻找其他操作系统特定的东西,但我想知道FXMLLoader.java中的这些行(在源代码中)是什么,以了解它为什么是barfing。在注释掉大部分代码之后,似乎导致barf的行是一个简单的File实例化:
File myFile = new File(userDirectoryString);
我使用了很多文件和目录,这行是我代码中第一次调用文件或目录。我已经验证了字符串“userDirectoryString”并且它是正确的。
有什么想法吗?
答案 0 :(得分:0)
我只能帮助你,因为你在这里:
public static final String INITIALIZE_METHOD_NAME = "initialize";
// Initialize the controller
Method initializeMethod = getControllerMethods().get(INITIALIZE_METHOD_NAME);
if (initializeMethod != null) {
try {
MethodUtil.invoke(initializeMethod, controller, new Object [] {});
} catch (IllegalAccessException exception) {
// TODO Throw when Initializable is deprecated/removed
// throw new LoadException(exception);
} catch (InvocationTargetException exception) {
throw new LoadException(exception);
}
}
您可以在OpenJFX中找到此代码。
我们可以看到,这意味着,该方法initialize()在其工作期间抛出了一个异常。
答案 1 :(得分:0)
你必须在它应该运行的系统上编译代码。 JVM扫描您的系统并为您构建它的机器写入字节代码。您的代码没有任何问题,这是JVM的工作方式。