JavaFX设置Controller时触发java.lang.NullPointerException问题排查
解决JavaFX中FilmeOverviewController初始化时的NullPointerException问题
嘿,我一眼就看出问题所在了——你在调用loader.load()之前就尝试获取控制器实例,这时候控制器还没被初始化,自然会抛出空指针异常!
问题根源
在JavaFX的FXMLLoader工作流程里,只有当你调用load()方法加载FXML文件时,才会完成以下核心操作:
- 解析FXML文件的布局结构
- 实例化对应的控制器类
- 将FXML中标记了
@FXML的控件注入到控制器对象中
而你的代码里,先执行了loader.getController(),这时候load()还没执行,控制器对象根本不存在,返回的是null,紧接着调用controller.setMainApp(this)就触发了NullPointerException。
修复方案
只需要调整代码的执行顺序,先调用loader.load()加载FXML,再获取控制器实例就可以解决这个问题。
修改后的showFilmeOverview()方法代码如下:
public void showFilmeOverview() { try { FXMLLoader loader = new FXMLLoader(); loader.setLocation(MainApp.class.getResource("resources/FilmeOverview.fxml")); // 先加载FXML文件,完成控制器实例化与控件注入 AnchorPane filmeOverview = (AnchorPane) loader.load(); // 现在才能获取到有效的控制器对象 FilmeOverviewController controller = loader.getController(); controller.setMainApp(this); rootLayout.setCenter(filmeOverview); } catch (IOException e) { e.printStackTrace(); } }
额外检查点(可选)
为了避免后续出现其他类似问题,你还可以确认以下两点:
- 确保
FilmeOverview.fxml文件的根节点正确指定了控制器类,比如添加属性:fx:controller="projeto.resources.FilmeOverviewController" - 检查FXML文件中所有标记
fx:id的控件,和控制器中@FXML注解的变量名完全一致(JavaFX对大小写敏感)
内容的提问来源于stack exchange,提问作者Eduardo Abreu
相关产品推荐
相关产品推荐

