JavaFX加载FXML设置新Scene时Label为null的空指针异常如何解决
问题根本原因
- 你的两个FXML场景都绑定了同一个
Controller类,每次加载FXML文件都会生成一个全新的Controller实例 - 触发按钮点击逻辑的是
firstScene.fxml对应的Controller实例,该场景内没有fx:id="nameLabel"的组件,所以这个实例的nameLabel属性没有被FXML框架注入,默认值为null,调用setText方法就会抛出空指针异常 - 加载
greetScene.fxml时会生成新的Controller实例,这个实例才持有合法的nameLabel引用,但你没有获取这个实例,直接操作了当前实例的null属性
修复步骤
1. 拆分Controller类,避免两个场景共用同一个Controller
分别创建两个Controller对应不同的场景:
FirstController.java(对应firstScene.fxml)
package greeter; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.stage.Stage; import java.io.IOException; public class FirstController { @FXML private TextField nameField; @FXML private Button button; public void buttonHandle(ActionEvent actionEvent) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(FirstController.class.getResource("/greeter/greetScene.fxml")); // 先加载FXML Scene greetScene = new Scene(fxmlLoader.load()); // 加载完成后获取对应场景的Controller实例 GreetController greetController = fxmlLoader.getController(); // 传递姓名参数 greetController.setName(nameField.getText()); // 切换场景 Stage window = (Stage) button.getScene().getWindow(); window.setScene(greetScene); } }
GreetController.java(对应greetScene.fxml)
package greeter; import javafx.fxml.FXML; import javafx.scene.control.Label; public class GreetController { @FXML private Label nameLabel; // 提供公共方法给上游Controller传值 public void setName(String name) { nameLabel.setText(name); } }
2. 修改两个FXML的Controller绑定配置
修改firstScene.fxml根节点的fx:controller属性:
fx:controller="greeter.FirstController"
修改greetScene.fxml根节点的fx:controller属性:
fx:controller="greeter.GreetController"
3. 其他类无需修改
你的Main类逻辑完全正常,不需要做任何改动。修复后运行程序,输入姓名点击按钮就可以正常跳转场景并展示欢迎文本。
内容的提问来源于stack exchange,提问作者noodles888
相关产品推荐
相关产品推荐

