fxmlLoader.getController() 导致空指针异常?
fxmlLoader.getController() leading to null pointer exception?
我正在尝试为加载 fxml 的 window 访问控制器 class 的实例。它加载没有错误,但是当我尝试使用
打印帐户数量时
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$launchApplication12(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait5(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(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$null8(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();
}
}
通过将 URL
传递给 load
方法,您使用 FXMLLoader
的 static
load
方法之一,当然不能存储FXMLLoader
实例中的控制器,因为没有关于可用实例的信息。
由于您已经在 FXMLLoader
构造函数中指定了 URL
,因此只需使用无参数 load
方法即可:
root = fxmlLoader.load();
NAC = (newAccountController) fxmlLoader.getController();
System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs());
您不能在 getController 之后执行 sysout
。您正在做的是,您在控制器 initilize
方法中创建或初始化 newAccModel
。
初始化花了一些时间才接到电话。它会在加载完成时调用。但是
NAC = (newAccountController) fxmlLoader.getController();
在这行之后,有负载未准备好。所以它只是给了 NPE。请确保在控制器
中执行初始化方法后访问newAccModel
我正在尝试为加载 fxml 的 window 访问控制器 class 的实例。它加载没有错误,但是当我尝试使用
打印帐户数量时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$launchApplication12(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait5(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(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$null8(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();
}
}
通过将 URL
传递给 load
方法,您使用 FXMLLoader
的 static
load
方法之一,当然不能存储FXMLLoader
实例中的控制器,因为没有关于可用实例的信息。
由于您已经在 FXMLLoader
构造函数中指定了 URL
,因此只需使用无参数 load
方法即可:
root = fxmlLoader.load();
NAC = (newAccountController) fxmlLoader.getController();
System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs());
您不能在 getController 之后执行 sysout
。您正在做的是,您在控制器 initilize
方法中创建或初始化 newAccModel
。
初始化花了一些时间才接到电话。它会在加载完成时调用。但是
NAC = (newAccountController) fxmlLoader.getController();
在这行之后,有负载未准备好。所以它只是给了 NPE。请确保在控制器
中执行初始化方法后访问newAccModel