有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java NullPointerException,尽管fx:id和fx:controller是正确的

我正在为我的lan应用程序创建带有日志的表。当我尝试运行这个应用程序时,它抛出NullPointerException,但是fx:id和fx:controller是正确的。我使用的是JavaFX12

我试图用Intellij重构fx:id和fx:controller,Intellij在logPane中正确地更改了这一点。fxml和LogPaneController。上课也一样,但还是不起作用。如果我在注释行中出现异常,所有应用程序都可以正常运行。我在谷歌上搜索了“FXML组件返回NUllPointerException”,但结果总是“您的fx:id或fx:controller名称在controller中不相同”

日志窗格。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。班

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();
    }
}

主窗格。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>

这里是Project structure

Tags:  

共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    仔细查看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)
    

    这意味着当buttonsPane.fxml处理

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

    元素

    此外,它还告诉我,您不仅使用LogPaneController表示logPane.fxml,还使用buttonsPane.fxml。每次加载fxml时都会创建单独的控制器实例;使用<fx:include>会创建一个单独的FXMLLoader实例来加载包含的fxml。只为其中一个注入logTable字段;对于另一个控制器实例,它仍然是null。(这甚至忽略了加载buttonsPane.fxml发生在加载logPane.fxml之前的事实,因此即使在加载buttonsPane.fxml完成时使用了相同的控制器实例,也没有基于logPane.fxml创建TableView。)

    buttonsPane.fxmllogPane.fxml使用不同的控制器类。仅仅使用同一个控制器类并不能让两个FXML“通信”。我会建议另一种选择,但你在那里做的没有任何意义(除了你试图引发NPE):isHover只需重新运行hover属性的值,对于尚未属于Scene的节点,该属性总是false