Java 在设置了默认值的情况下启动Popupwindow时出现NullPointerException,否则它将正常工作

Java 在设置了默认值的情况下启动Popupwindow时出现NullPointerException,否则它将正常工作,java,javafx,nullpointerexception,initialization,popupwindow,Java,Javafx,Nullpointerexception,Initialization,Popupwindow,当我通过主控制器的按钮事件打开弹出窗口时 弹出窗口出现,一切看起来都很完美。 但当我试图在组合框或文本字段中设置数据时 PopUpPersController: public PopUpPersController() { initialize(); } private void initialize() { txtMa_LohnGesKum.setText("1200.12"); } 然后按下按钮打开弹出窗口,我得到一个空指针异常 main控制器称为Projektcontro

当我通过主控制器的按钮事件打开弹出窗口时 弹出窗口出现,一切看起来都很完美。 但当我试图在组合框或文本字段中设置数据时

PopUpPersController:

public PopUpPersController() {
    initialize();
}
private void initialize() {
    txtMa_LohnGesKum.setText("1200.12");
}
然后按下按钮打开弹出窗口,我得到一个空指针异常

main控制器
称为
Projektcontroller
, 关联的
FXML文件
称为
Projekt.FXML
popupwindow控制器称为“PopupUppersController”, 关联的
FXML文件
称为
PersCalc.FXML
。 所有元素都有fxId。 我认为用defaultdata填充组合框或文本字段的工作方式与主控制器中的工作方式相同。。。 我没有找到一个涵盖这个问题的答案

我是Java新手,非常感谢您的帮助和问候 马库斯

主控制器或项目控制器中打开弹出窗口的按钮的代码:

@FXML
void onAction_Test(ActionEvent event) {
    try {
        Parent root1 = FXMLLoader.load(getClass().getResource("/ui/fxml/PersCalc.fxml"));
        Stage persStage = new Stage();
        persStage.setTitle("Personalkosten-Rechner");
        persStage.setScene(new Scene(root1));
        persStage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
我试图找出主要错误:

  • PersCalc.fxml中的javafx.fxml.LoadException
  • 此行中的代码:

    <BorderPane xmlns="http://javafx.com/javafx/10.0.1"xmlns:fx="http://javafx.com/fxml/1" fx:controller="ui.controller.PopUpPersController">
    
    Parent root1=FXMLLoader.load(getClass().getResource("/ui/fxml/PersCalc.fxml"));
    
    3.将数据分配到
    textfield

    原因:java.lang.NullPointerException位于 初始化(popuperscocontroller.java:123)

    此行中的代码(请参见上面的
    initialize()
    ):


    加载包含
    fx:controller
    属性的fxml会导致使用构造函数以0个参数创建控制器类的实例而产生
    fxmloader
    。在注入任何字段之前调用构造函数,导致出现
    NullPointerException
    ,即使这些字段可由
    FXMLLoader
    访问,并且fxml文件包含正确的
    fx:id
    属性

    假设您正确设置了字段/
    fx:id
    ,使
    initialize
    方法对
    fxmloader
    可见,而不是从构造函数调用
    initialize
    ,应该可以解决此问题:

    public PopUpPersController() {
    }
    
    @FXML // you need this annotation for non-public members to be visible to FXMLLoader
    private void initialize() {
        txtMa_LohnGesKum.setText("1200.12");
    }
    

    确保应注入到的字段
    fxmloader
    也用
    @FXML
    (或
    public
    )注释fxml文件中设置了必需的
    fx:id
    属性。

    加载包含
    fx:controller
    属性的fxml会导致使用构造函数以0个参数创建控制器类的实例。在注入任何字段之前调用构造函数,导致出现
    NullPointerException
    ,即使这些字段可由
    FXMLLoader
    访问,并且fxml文件包含正确的
    fx:id
    属性

    假设您正确设置了字段/
    fx:id
    ,使
    initialize
    方法对
    fxmloader
    可见,而不是从构造函数调用
    initialize
    ,应该可以解决此问题:

    public PopUpPersController() {
    }
    
    @FXML // you need this annotation for non-public members to be visible to FXMLLoader
    private void initialize() {
        txtMa_LohnGesKum.setText("1200.12");
    }
    

    确保字段
    fxmloader
    应该注入到的字段也用
    @FXML
    (或
    public
    )进行了注释,并且在FXML文件中设置了必需的
    fx:id
    属性。

    请。。。请…非常感谢你的清楚解释。它很有效,我对正在发生的事情有了更好的了解,Marcust非常感谢你的清晰解释。它起作用了,我对正在发生的事情有了更好的了解