ChromeKK
ChromeKK

Reputation: 160

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

Upvotes: 0

Views: 910

Answers (2)

fabian
fabian

Reputation: 82461

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.

Upvotes: 3

annszafr
annszafr

Reputation: 16

You have getter class for private logTable, so you can get a value, but I do not see the value initialization or setter class (which will initialize the value).

Upvotes: 0

Related Questions