JavaFX FXML加载错误(Nullpointerexception)

时间:2014-04-30 20:46:58

标签: java javafx loading fxml

是的,我知道这个问题经常被问到,我使用搜索功能,但无法用这些答案解决我的问题,现在我很难在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)at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)at at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230)at at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3191)at at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3164)at at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3140)at at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3120)at at   javafx.fxml.FXMLLoader.load(FXMLLoader.java:3113)at at   de.toxiclab.jNotepad.Main.start(Main.java:32)at   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)at   com.sun.javafx.application.PlatformImpl $ 6.run(PlatformImpl.java:298)     在   com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:95)     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)at   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 at   de.toxiclab.jNotepad.NotepadController.getStage(NotepadController.java:199)     在   de.toxiclab.jNotepad.NotepadController。(NotepadController.java:45)     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native   方法)at   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     at java.lang.reflect.Constructor.newInstance(Constructor.java:408)     在java.lang.Class.newInstance(Class.java:433)at   sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51)at   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%正确。

1 个答案:

答案 0 :(得分:2)

所以看到错误之后看似以控制器类为中心' 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());
            }
 });

或类似的东西。

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