JavaFX FXMLLoader getController NullPointerException

У меня есть проект в школе, где я должен разработать программу, в которой вы сначала можете выбрать, хотите ли вы сохранять/читать в/из базы данных SQL или сохранять/читать в/из XML.

Я сделал графический интерфейс, в котором вы можете выбирать между обоими методами.

Графический интерфейс закрывается после того, как пользователь нажимает одну из кнопок, и открывается графический интерфейс MainMenu. Теперь мне нужно знать в 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 для

mc.setSave("sql")

person bad    schedule 14.12.2017    source источник


Ответы (2)


Во-первых, чтобы понять эту проблему, вы должны сделать несколько трюков, чтобы определить, в чем ваша проблема. Когда вы делаете:

 System.out.println(mc);

Вы обнаружите, что результат равен null. Таким образом, вы не можете вызывать setSave("sql") с объектом null, у вас есть нулевой контроллер, потому что вы не указали местоположение своего файла, но вы можете изменить некоторые строки, чтобы решить вашу проблему:

 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();
        }
person Menai Ala Eddine - Aladdin    schedule 14.12.2017

Вы вызываете статический метод 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();
person James_D    schedule 14.12.2017