【问题标题】:JavaFX web deployment: FXMLLoader NullPointerExceptionJavaFX Web 部署:FXMLLoader NullPointerException
【发布时间】:2014-12-23 11:45:53
【问题描述】:

我想尝试 JavaFX Web 浏览器部署,因此我使用 IntelliJ 社区版 14.0.2 JavaFX 应用程序模板开始了一个非常简单的测试项目。代码如下:(NO插件、外部库或maven)

Main.java

@Override
public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 300, 275));
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}

Controller.java(附加到 sample.fxml)

@FXML
private TextField textField;

@FXML
private Label label;

@FXML
private void setLabelText() {
    label.setText(textField.getText());
}

sample.fxml(布局文件)

<VBox alignment="TOP_CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
      prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/8"
      xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <padding>
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
   </padding>
   <TextField fx:id="textField" onAction="#setLabelText"/>
   <Label fx:id="label" text="Label">
      <font>
         <Font size="96.0"/>
      </font>
   </Label>
</VBox>

现在,当我将应用程序构建为 JAR 时,它可以毫无问题地运行。 但是,当我使用预定义的“JavaFXApp”工件构建它时,它会生成一个 html、一个 jnlp 和一个 jar。当我在我的网络浏览器(Firefox Nightly 64bit)中打开 html 时,它给了我以下错误:

java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at sample.Main.start(Main.java:13)
    at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/1838209255.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$44/1604839423.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$141(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/982109627.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.NullPointerException: Location is required.
    at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/1838209255.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$44/1604839423.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$141(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/982109627.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at sample.Main.start(Main.java:13)
    ... 11 more

相关的代码行好像是

Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));

但是,当作为单个独立 JAR 构建和打开时,同一行代码可以正常工作! 关于为什么会发生错误或如何解决它的任何想法?

【问题讨论】:

    标签: java intellij-idea javafx fxml fxmlloader


    【解决方案1】:

    这个错误有点神秘,但可以理解。您将获得一个带有本地化消息“需要位置”的空指针,这表明您没有设置位置来查找 FXML。

    getClass().getResource("sample.fxml") 返回空值,因此 FXMLLoader 会抛出空指针。检查你的 fxml 的路径,你可能想在它前面加上一个“/”,比如“/sample.fxml”。

    【讨论】:

    • 这并没有解决问题:(正如我在原帖中所说,独立的 JAR 工作得很好,即使没有前置“/”。这只是引发错误的 JavaFX 工件。 .
    • 那看起来是classpath的问题,你可以检查一下jar内容,看看里面有没有sample.fxml?
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2015-12-20
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多