我已经阅读了有关此主题的一些相关文章,但是无法使用它们来解决我的问题。我相信我的失败是一种理解,而不是我面临一个独特的问题。但是,我完全陷入僵局。
我正在使用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 post和this post,他们两个都建议我必须运行loader.load()[给定FXMLLoader loader = new FXMLLoader()],以便从对象中检索数据。但是,我已经尝试过了,但由于出错而导致错误:InvocationTargetExceptions和IllegalStateExceptions。我还尝试使用
实例化一个非null的FXMLLoader对象。FXMLLoader load = new FXMLLoader(getClass.getResource("sample.fxml"));
但是它似乎对对象的内容没有影响(是的,我正在用文件名替换“ sample.fxml”。)
我不喜欢发表类似的帖子,但是我不知道该怎么做。
答案 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()
之前调用的。