简体   繁体   中英

NullPointerException despite the fx:id and fx:controller are correct

I'am creating table with logs for my lan app. When I try run this app, it throws NullPointerException, but the fx:id and fx:controller are correct. I am using JavaFX 12.

I tried to refactor the fx:id and fx:controller with Intellij and Intellij changes this correctly in logPane.fxml and in LogPaneController.class too, but it was still not working. If I comment line where exception is trowed, all of app working fine. I googled phrase "FXML component returns NUllPointerException", but result was always "your fx:id or fx:controller name is not the same in controller".

logPane.fxml

 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane HBox.hgrow="ALWAYS" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.lanssmaker.controller.LogPaneController"> <children> <TableView fx:id="logTable" prefHeight="574.0" prefWidth="382.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <columns> <TableColumn maxWidth="140.0" minWidth="70" prefWidth="70.0" text="Time"/> <TableColumn text="Content"/> <TableColumn maxWidth="140.0" minWidth="70" prefWidth="70.0" text="Category"/> </columns> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/> </columnResizePolicy> </TableView> </children> </AnchorPane> 

LogPaneController.class

 public class LogPaneController { @FXML private TableView<Log> logTable; //it's null public TableView<Log> getLogTableView() { return logTable; } public void initialize() { //example ussage calling NullPointerException logTable.isHover(); } } 

Exception Log

 Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:835) Caused by: javafx.fxml.LoadException: /D:/Programming/Java/javastart/ssmaker/target/classes/fxml/buttonsPane.fxml /D:/Programming/Java/javastart/ssmaker/target/classes/fxml/mainPane.fxml:17 at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2595) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466) at javafx.fxml/javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1154) at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:754) at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113) at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106) at ssmaker/com.lanssmaker.main.Main.start(Main.java:16) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) at java.base/java.security.AccessController.doPrivileged(AccessController.java:389) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ... 1 more Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76) at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273) at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2591) ... 22 more Caused by: java.lang.NullPointerException at ssmaker/com.lanssmaker.controller.LogPaneController.initialize(LogPaneController.java:25) ... 33 more 

package com.lanssmaker.main;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;



public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Pane mainPane = FXMLLoader.load(getClass().getResource("/fxml/mainPane.fxml"));
        Scene scene = new Scene(mainPane);
        stage.setScene(scene);
        stage.setTitle("LAN ScreenShots Maker");
        stage.show();
    }
}

mainPane.fxml

 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.*?> <AnchorPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="624.0" prefWidth="813.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.lanssmaker.controller.MainController"> <children> <HBox layoutX="158.0" layoutY="143.0" prefHeight="624.0" prefWidth="813.0" AnchorPane.bottomAnchor="25.0" AnchorPane.leftAnchor="25.0" AnchorPane.rightAnchor="25.0" AnchorPane.topAnchor="25.0"> <children> <AnchorPane HBox.hgrow="NEVER"> <children> <VBox prefHeight="574.0" prefWidth="389.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="0.0"> <children> <fx:include source="connectionPane.fxml"/> <fx:include source="buttonsPane.fxml"/> </children> </VBox> </children> </AnchorPane> <fx:include source="logPane.fxml"/> </children> </HBox> </children> </AnchorPane> 

Here is Project structure

Take a close look at the stacktrace:

...
Caused by: javafx.fxml.LoadException: 
/D:/Programming/Java/javastart/ssmaker/target/classes/fxml/buttonsPane.fxml
/D:/Programming/Java/javastart/ssmaker/target/classes/fxml/mainPane.fxml:17
...
Caused by: java.lang.NullPointerException
    at ssmaker/com.lanssmaker.controller.LogPaneController.initialize(LogPaneController.java:25)

This means that the exception happends when you load buttonsPane.fxml when FXMLLoader deals with the

<fx:include source="buttonsPane.fxml"/>

element.

Furthermore it tells me that you're not only using LogPaneController for logPane.fxml , but also for buttonsPane.fxml . Seperate controller instances are created every time you load an fxml; using <fx:include> results in a seperate FXMLLoader instance being created to load the included fxml. The logTable field is only injected for one of them; for the other controller instance it remains null . (This is even ignoring the fact that loading buttonsPane.fxml happens before loading logPane.fxml so even if the same controller instance was used at the time loading buttonsPane.fxml completes, the TableView has not been created based on logPane.fxml .)

Use seperate controller classes for buttonsPane.fxml and logPane.fxml . You won't get both fxmls "to communicate" by simply using the same controller class. I'd suggest an alternative, but what you're doing there doesn't make any sense (except you trying to provoke a NPE): isHover simply retuns the value of the hover property which is always false for nodes that are not yet part of a Scene .

您有私有logTable的getter类,因此可以获取一个值,但是我看不到值初始化或setter类(它将初始化值)。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM