JavaFX传递String时触发FXML加载异常问题求助
解决JavaFX传递字符串时的FXMLLoader.LoadException和NullPointerException问题
从你的栈追踪信息能一眼定位到问题根源:错误的控制器数据传递方式,具体来说:
你在Change_relocationDetailsController的initialize方法里手动new了一个ChangeOrDeleteController实例,这个全新的对象和触发按钮点击的那个控制器完全无关——它的moveID从来没被validateID()方法赋值过,调用get_MoveId()时要么返回null,要么直接触发空指针异常,最终导致FXML加载失败。
正确的解决步骤
1. 修改触发跳转的updateEvent方法,直接传递数据给新控制器
在加载change_relocationDetails.fxml后,通过FXMLLoader获取新控制器的实例,直接把当前控制器的moveID传递过去:
public void updateEvent(ActionEvent event) { try{ FXMLLoader fxmlLoad = new FXMLLoader(getClass().getResource("change_relocationDetails.fxml")); Parent root = (Parent) fxmlLoad.load(); // 获取新页面的控制器实例 Change_relocationDetailsController detailsController = fxmlLoad.getController(); // 直接传递moveID,如果想更规范可以给新控制器加setter方法 detailsController.moveID = this.moveID; Stage stage = new Stage(); stage.setScene(new Scene(root)); stage.setTitle("Update Relocation Details Of : "+moveID); stage.show(); } catch(Exception e){ e.printStackTrace(); // 建议打印完整栈追踪,方便排查问题 } }
2. 修改Change_relocationDetailsController的初始化逻辑
删掉手动newChangeOrDeleteController的代码,直接用传递过来的moveID设置文本框:
public class Change_relocationDetailsController implements Initializable { // 改成私有字段+setter方法,更符合面向对象封装规范 private String moveID; @FXML private TextField move_id; @Override public void initialize(URL url, ResourceBundle rb) { // 用传递过来的moveID设置文本框内容 move_id.setText(moveID); move_id.setDisable(true); } // 可选:添加setter方法,替代直接访问公共字段 public void setMoveID(String moveID) { this.moveID = moveID; } }
为什么原来的代码行不通?
你手动new的ChangeOrDeleteController是一个完全独立的对象,它没有经历过FXML加载流程,也没有被用户输入过moveID,内部的moveID是未初始化的null值。而正确的做法是通过FXMLLoader.getController()获取FXML加载出来的控制器实例——这个实例已经和新页面的UI绑定,我们只需要把数据传递给它即可。
内容的提问来源于stack exchange,提问作者Elinoter99
相关产品推荐
相关产品推荐

