【问题标题】:JavFX FXML Loading Error (Nullpointerexception)JavFX FXML 加载错误(Nullpointerexception)
【发布时间】:2014-06-17 08:11:33
【问题描述】:

是的,我知道这个问题经常被问到,我使用了搜索功能,但无法用这些答案解决我的问题,现在我厌倦了在 google 或其他任何地方搜索。

我的问题:我尝试将 FXML 文件加载到我的 Javacode 中:

public class Main extends Application {

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

@Override
public void start(Stage primaryStage) throws Exception {
    try {

        //Layout laden
        Pane pane = FXMLLoader.load(getClass().getResource("layout/main_layout.fxml"));

        //Scene erstellen und initialisieren
        Scene scene = new Scene(pane);
        scene.getStylesheets().add(getClass().getResource("css/main_layout.css").toExternalForm());
        primaryStage.setScene(scene);

        //Breite und Höhe der Stage setzen
        primaryStage.setWidth(1024);
        primaryStage.setHeight(768);

        primaryStage.setTitle("Untitled - jNotepad");

        primaryStage.show();
    } catch(IOException e) {
        e.printStackTrace();
    }
}
}

我的 FXML 文件位于 de.toxiclab.jNotepad.layout 包中,这意味着它与 layout/main_layout.fxml 中的路径相关,因此路径必须正确。

然后它打印出这个丑陋的异常:

javafx.fxml.LoadException: /J:/Eclipse%20Workspace/jNotepad/bin/de/toxiclab/jNotepad/layout/main_layout.fxml:19

在 javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2617) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2595) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3191) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3164) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3140) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3120) 在 javafx.fxml.FXMLLoader.load(FXMLLoader.java:3113) 在 de.toxiclab.jNotepad.Main.start(Main.java:32) 在 com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837) 在 com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335) 在 com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301) 在 com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298) 在 java.security.AccessController.doPrivileged(Native Method) 在 com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298) 在 com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 在 com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 在 com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) 在 com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112) 在 java.lang.Thread.run(Thread.java:744) 引起: java.lang.NullPointerException 在 de.toxiclab.jNotepad.NotepadController.getStage(NotepadController.java:199) 在 de.toxiclab.jNotepad.NotepadController.(NotepadController.java:45) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:408) 在 java.lang.Class.newInstance(Class.java:433) 在 sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51) 在 javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:932) 在 javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:976) 在 javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:216) 在 javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:738) 在 javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) ... 19 更多

但我不明白,为什么会有一个该死的 Nullpointerexception,PATH 是 100% 正确的。

【问题讨论】:

  • NotepadController 第 199 行是什么?
  • return ((Stage)this.textPane.getScene().getWindow());
  • 如果我不得不猜测,它试图在场景完全显示之前抓取窗口,这会导致您的空指针异常,您可能需要在舞台中添加一个 WindowEvent.WINDOW_SHOWN 处理程序那一点,然后在显示窗口后尝试获取窗口
  • 我该怎么做呢?只需修改getStage方法即可?
  • 我会回答的,一秒钟

标签: java javafx loading fxml


【解决方案1】:

因此,在看到错误似乎围绕控制器类“NotePadController”后,我相信您看到此NullPointerException 的原因是由于节点尚未附加到场景中。鉴于此,您可能希望尝试将WindowEvent.WINDOW_SHOWN 处理程序附加到方法中的该点。

例如:

你提到第 199 行是return ((Stage)this.textPane.getScene().getWindow());

也许,最好有一个静态的 Window 变量(比如称为 'window' )并说:

(Stage)this.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                window = ((Stage)this.textPane.getScene().getWindow());
            }
 });

或类似的东西。

错误的主要内容也可能来自其他地方。祝你好运!有时这些类型的问题可能有点棘手。

【讨论】:

  • NPE 是因为在他访问它时节点还没有附加到场景。
  • 是的,这样说更好,我会更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2019-06-24
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多