2016-05-16 125 views
1

我试图访问加载fxml的窗口的控制器类的实例。它加载没有错误,但是当我尝试打印使用的帐户数时fxmlLoader.getController()导致空指针异常?

System.out.println("from NAW: "+ NAC.newAccModel.users.getNumAccs()); 

它在下面给出空指针例外。 (第36行是println

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()

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); 
} 

这里控制器,如果它的事项

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(); 

    } 

} 
+0

'newAccountModel()'的构造函数有什么作用?您不提供代码。它是否将用户与'newAccountModel'相关联,并将参考存储在'newAccountModel'的'users'成员中?如果不是,那可能是你的NullPointerException的源头:'users'为null,所以'users.getItems()'抛出一个NullPointerException异常。请参阅:[什么是空指针异常,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i -fix-it)请遵循[class命名约定](http://www.iwombat.com/standards/JavaStyleGuide.html)。 – jewelsea

回答

0

传递一个URL到采用load方法,您使用 load方法之一FXMLLoader,这当然不能将控制器存储在你的FXMLLoader实例中,因为没有关于可用实例的信息。

既然你已经在FXMLLoader构造指定URL,只需使用参数的load方法代替:

root = fxmlLoader.load(); 
+0

这工作就像一个魅力!为什么要第二次声明url会导致它返回一个空控制器? – Chase

+0

@Chase:编写'fxmlLoader.load(url);'与编写'FXMLLoader.load(url)'具有相同的效果。由于该加载方法是“静态”,因此没有可用的信息可让该方法将其创建的控制器实例与您(未)使用的“FXMLLoader”实例相关联。如果你想像控制器一样访问'FXMLLoader'的属性(假设它是在加载过程中创建的),你需要使用非''static''加载'方法之一。 – fabian

0
NAC = (newAccountController) fxmlLoader.getController(); 
System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs()); 

你不能给getController后做sysout。你正在做的是,你在控制器initilize方法中创建或初始化newAccModel。 intialize需要一段时间才能打电话。它会在加载完成时调用。但是

NAC = (newAccountController) fxmlLoader.getController(); 

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