JavaFX FXMLLoader getController NullPointerException

JavaFX FXMLLoader getController NullPointerException

我在学校有一个项目,我必须开发一个程序,你首先可以选择是要 save/read to/from SQL 数据库还是 save/read to/from XML.

我制作了一个 GUI,您可以在其中选择两种方法。

用户单击其中一个按钮并打开 MainMenu GUI 后,GUI 关闭。 现在我需要知道 MainMenuController 中用户选择了什么。 我在网上找到了一种在第一个控制器中调用 MainMenuController 的方法,其中 FXMLLoader.getController().

try {                       
    Stage stage = new Stage();
    FXMLLoader Loader = new FXMLLoader();
    Parent root = Loader.load(getClass().getResource("MainMenu.fxml"));

    MainMenuController mc = Loader.getController();
    mc.setSave("sql");

    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();
}
catch (Exception e) {
    e.printStackTrace();
}

主菜单控制器

public class MainMenuController {   
    private String save = null;

    public void setSave(String save) {
        this.save=save;
    }
    public String getSave() {
        return save;
    }
}

但是当我尝试访问 MainMenuController 中的方法时,我得到 NullPointerException for

mc.setSave("sql")

您正在调用 static 方法 FXMLLoader.load(URL)。因为这是一个静态方法,所以它对您创建的 FXMLLoader 实例的状态没有影响;具体来说,控制器字段未设置。

而是在 FXMLLoader 实例上设置位置,并调用 实例 方法 load():

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("MainMenu.fxml"));
// or just FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenu.fxml"));

Parent root = loader.load();

首先,要了解这个问题,您应该使用一些技巧来检测您的 problem.When 在哪里:

 System.out.println(mc);

你会发现结果是null。所以你不能用null对象调用setSave("sql"),你得到一个空控制器,因为你没有指定文件的位置,但您可以更改一些行来解决您的问题:

 try {
            Stage stage = new Stage();
            FXMLLoader fxm = new FXMLLoader(getClass().getResource("MainMenu.fxml"));

            Parent parent = (Parent) fxm.load();
            Scene scene = new Scene(parent);
            stage.setScene(scene);
            stage.show();
            FirstController mc = fxm.getController();
            System.out.println(mc);
            mc.setSave("sql");
        } catch (Exception e) {
            e.printStackTrace();
        }