NullPointerException, несмотря на то, что fx: id и fx: controller верны - PullRequest
0 голосов
/ 06 июля 2019

Я создаю таблицу с журналами для моего сетевого приложения. Когда я пытаюсь запустить это приложение, оно выдает NullPointerException, но fx: id и fx: controller верны. Я использую JavaFX 12.

Я попытался провести рефакторинг контроллера fx: id и fx: с Intellij и Intellij, чтобы правильно изменить это в logPane.fxml и LogPaneController.class, но он все еще не работал. Если я прокомментирую строку, где выдано исключение, все приложение работает нормально. Я погуглил фразу «Компонент FXML возвращает NUllPointerException», но результатом всегда было «ваш fx: id или fx: имя контроллера не совпадает в контроллере».

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 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>

Вот Структура проекта

Ответы [ 2 ]

3 голосов
/ 06 июля 2019

Внимательно посмотрите на трассировку стека:

...
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)

Это означает, что исключение происходит, когда вы загружаете buttonsPane.fxml, когда FXMLLoader имеет дело с элементом

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

.

Более того, он говорит мне, что вы используете не только LogPaneController для logPane.fxml, но и для buttonsPane.fxml.Отдельные экземпляры контроллера создаются каждый раз, когда вы загружаете fxml;использование <fx:include> приводит к созданию отдельного экземпляра FXMLLoader для загрузки включенного fxml.Поле logTable вводится только для одного из них;для другого экземпляра контроллера он остается null.(Это даже игнорирует тот факт, что загрузка buttonsPane.fxml происходит перед загрузкой logPane.fxml, поэтому даже если тот же экземпляр контроллера использовался во время загрузки buttonsPane.fxml, TableView не был создан на основе logPane.fxml.)

Используйте отдельные классы контроллеров для buttonsPane.fxml и logPane.fxml.Вы не сможете заставить оба fxmls «общаться», просто используя один и тот же класс контроллера.Я бы предложил альтернативу, но то, что вы там делаете, не имеет никакого смысла (кроме попытки спровоцировать NPE): isHover просто возвращает значение свойства hover, которое всегда равно false дляузлы, которые еще не являются частью Scene.

0 голосов
/ 06 июля 2019

У вас есть класс getter для private logTable, поэтому вы можете получить значение, но я не вижу инициализации значения или класса setter (который будет инициализировать значение).

...