似乎无法实例化非null的FXMLLoader

时间:2019-03-19 22:01:36

标签: java javafx nullpointerexception fxml

我已经阅读了有关此主题的一些相关文章,但是无法使用它们来解决我的问题。我相信我的失败是一种理解,而不是我面临一个独特的问题。但是,我完全陷入僵局。

我正在使用JavaFX构建CRUD应用程序。我的应用程序按钮之一“导入数据”引发NullPointerExceptions:

// *a button that opens a new window with a textField where the user can paste text data*
@FXML
private void importDataButton(ActionEvent event) {
    // *load the fxml file*
    URL viewLocation = getClass().getResource("/importView.fxml");
    // *get the file's controller*
    FXMLLoader loader = new FXMLLoader();
    ImportController importController = loader.getController();
    importController.setMainController(this);
    loader.setLocation(viewLocation);

    try {
        loader.load();
    } catch (IOException exception) {
        System.out.println("IO Exception thrown.");
        return;
    }
....
}

我对IntelliJ的调试器还不太满意,但是我已经用它来确定FXMLLoader对象为null。所以当

importController.setMainController(this);

执行,因为此对象 引用为null,将引发NullPointerException。我认为。那么

ImportController importController = loader.getController();

无法从FXMLLoader对象(加载器)中检索控制器。

作为参考,setMainController()在另一个名为ImportController的类中,该方法的代码如下:

public void setMainController(MainController mainController) {
    this.mainController = mainController;
}

我尝试过的事情:

我阅读了this postthis post,他们两个都建议我必须运行loader.load()[给定FXMLLoader loader = new FXMLLoader()],以便从对象中检索数据。但是,我已经尝试过了,但由于出错而导致错误:InvocationTargetExceptions和IllegalStateExceptions。我还尝试使用

实例化一个非null的FXMLLoader对象。
FXMLLoader load = new FXMLLoader(getClass.getResource("sample.fxml"));

但是它似乎对对象的内容没有影响(是的,我正在用文件名替换“ sample.fxml”。)

我不喜欢发表类似的帖子,但是我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

问题是您要在loader.getController()之前呼叫loader.load()。这就是为什么您的importController在调用importController.setMainController(this)时为空的原因。

先致电loader.load()

URL viewLocation = getClass().getResource("/importView.fxml");
FXMLLoader loader = new FXMLLoader(viewLocation);

try {
    loader.load();

    ImportController importController = loader.getController();
    importController.setMainController(this);
} catch (IOException exception) {
    exception.printStackTrace();
}

但是请注意,您的initialize()中的ImportController方法是在setMainController()之前调用的。