首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fxmlLoader.getController()导致空指针异常?

fxmlLoader.getController()导致空指针异常?
EN

Stack Overflow用户
提问于 2016-05-16 23:08:16
回答 2查看 1K关注 0票数 1

我试图访问加载fxml的窗口的控制器类实例。它加载时没有错误,但是当我尝试使用

代码语言:javascript
复制
System.out.println("from NAW: "+ NAC.newAccModel.users.getNumAccs());

它给出了下面的空指针异常。(第36行是println)

代码语言:javascript
复制
java.lang.NullPointerException
at muselogin.newAccountWindow.<init>(newAccountWindow.java:36)
at muselogin.MuseLoginController.initialize(MuseLoginController.java:84)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at muselogin.MuseLogin.start(MuseLogin.java:22)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)

这里是我试图调用getController()的地方

代码语言:javascript
复制
public class newAccountWindow extends Application {



    Stage stage = new Stage();
    newAccountController NAC = new newAccountController();

public newAccountWindow(){
    Parent root=null;
    try{
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("newAccountWindow.fxml"));
    root = fxmlLoader.load(getClass().getResource("newAccountWindow.fxml"));
   // fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
    NAC = (newAccountController) fxmlLoader.getController();
    System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs());
    }catch(Exception e){
        e.printStackTrace();
    }
    Scene scene = new Scene(root);
    //scene.getStylesheets().add(MuseLogin.class.getResource("newAccCSS.css").toExternalForm());        
    stage.setScene(scene);
}

这是控制器,如果有关系的话

代码语言:javascript
复制
public class newAccountController implements Initializable {

    newAccountModel newAccModel;

    @FXML
    private TextField usernameField;
    @FXML
    private PasswordField passwordField;
    @FXML
    private Button createAccount;
    @FXML
    private PasswordField confirmField;
    @FXML
    private Label usernameBlankMessage;
    @FXML
    private Label usernameTakenMessage;
    @FXML
    private Label passwordMessage;


    //counter to check if all 3 conditions are met
    int makeAcc = 0;

    //action event for make account button clicked
    @FXML
    private void createAccountClicked(ActionEvent event) {

        //does account creation stuff

    }

    public int getNumAccs(){
        return newAccModel.users.getNumAccs();
    }

    //required initialize function, initializes model
    @Override
    public void initialize(URL url, ResourceBundle rb) {

        newAccModel = new newAccountModel();

    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-17 10:21:29

通过将一个URL传递给load方法,您可以使用FXMLLoaderstatic load方法之一,当然它不能将控制器存储在FXMLLoader实例中,因为没有有关该实例的信息。

由于您已经在URL构造函数中指定了FXMLLoader,所以只需使用无参数的load方法:

代码语言:javascript
复制
root = fxmlLoader.load();
票数 1
EN

Stack Overflow用户

发布于 2016-05-17 10:36:24

代码语言:javascript
复制
 NAC = (newAccountController) fxmlLoader.getController();
 System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs());

不能在sysout之后执行getController。您要做的是在控制器newAccModel方法中创建或初始化initilize。一段时间后才接到电话。当加载完成时,它将调用。但

代码语言:javascript
复制
 NAC = (newAccountController) fxmlLoader.getController();

在这条线之后,负载还没有准备好。所以它只是给NPE。请确保在控制器中执行初始化方法后访问newAccModel

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37264610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档