我无法找到我的程序发送异常的原因

时间:2018-12-03 16:43:18

标签: java javafx

我试图从文本字段登录后获取用户名,并通过实例化“ logincontroller”类的新对象传递到另一个场景,但是它显示“ NullPointerException”错误。在第一个类“ Logincontroller”中,我设法通过调用方法“ CurrentUsername()”来打印用户名,在另一个类“ AddDocument”中调用了相同的方法,但该方法不起作用。首先,从用户名文本字段存储用户名并在另一个场景中访问用户名是否正确?登录后是否有更好的方法来访问另一个场景中的用户名?我想知道,如果有人能帮助我,我将非常感激。

public class LoginController implements Initializable {
@FXML
    private TextField txtUsername;
    @FXML
    private TextField txtPassword;
    @FXML
    .
    .
    .
     @FXML
    public void loginaction (ActionEvent event){
        try {

            if (this.loginmodel.isLogin(this.txtUsername.getText(),this.txtPassword.getText(),((Option)this.RoleSelection.getValue()).toString())){

                Stage stage = (Stage)this.btnLogin.getScene().getWindow();
                stage.close();

                switch (((Option)this.RoleSelection.getValue()).toString()){

                    case "Employee" :
                        EmployeeLogin ();
                        break;
                    case "Student":
                       StudentLogin();
                        break;
                    case "Admin":
                        AdminLogin();
                        System.out.println(CurrentUsername()); // Here it has value and shows the username 
                        break;
                }

            }

            else {this.loginStatus.setText("Der Benutzername oder das Kenntwort ist nicht Korrekt");}
        }
        catch (Exception localException){
            // System.out.print("test failed");
        }
    }


   public String CurrentUsername() {
             String username = txtUsername.getText();
              return  username;
    }

}



   public Class AddDocument {

        @FXML
        private TextField DocumentId;
        @FXML
        private TextField DocumentName;
        @FXML
        private TextField Date;
          .
          .
          .
        // for the username I created a new object from the class where there is the text field "txtUsername.getText()" 

    public static void main(String[] args) {
           LoginController loginController = new LoginController ();

          String User = loginController.CurrentUsername();

          System.out.println(User); // here it it doesn't show the value,  but an exception Caused by: java.lang.NullPointerException

        }

       }

3 个答案:

答案 0 :(得分:2)

由于您正面临NPE,我觉得txtUsername为空。

设置txtUsername的方式和位置?

尝试将方法CurrentUsername()更改为

public String CurrentUsername() {
    if (txtUsername != null) {
        return txtUsername.getText();
    else {
        return null;
    }
}

这样,至少您不会拥有NPE。然后查看在何处以及如何设置txtUsername

答案 1 :(得分:1)

您尚未实例化两个TextField对象,因此,当您从CurrentUsername方法中调用对象'txtUsername'上的方法时,会抛出NullPointerException

解决问题的一种方法是在LoginController类的构造函数中实例化已声明的对象,例如:

public LoginController() {
    txtUsername = new TextField();
    txtPassword = new TextField();
}

答案 2 :(得分:0)

您先调用控制器,然后直接调用该用户,该用户为null。

 LoginController loginController = new LoginController ();

 String User = loginController.CurrentUsername();

编辑:

我只需创建一个具有属性,获取器和设置器的User类,并从Main类中实例化它

public class Person {
    private String userName;
    private String someUsefulValue;

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getSomeUsefulValue() {
        return someUsefulValue;
    }
    public void setSomeUsefulValue(String someUsefulValue) {
        this.someUsefulValue = someUsefulValue;
    }
    @Override
    public String toString() {
        return "Person [userName=" + userName + ", someUsefulValue=" + someUsefulValue + "]";
    }

然后在您的主类中使用它:

Person user = new Person();

    public String getCurrentUser() {
        return user.getUserName();
    }

    public void setUser(Person p) {
        this.user = p;
    }

在Login控制器内部,您需要引用mainApp,例如:

  // Reference to the main application.
    private MainApp mainApp;


     /**
     * Called to give a reference back to itself.
     */
    public void setMainApp(MainApp mainApp) {
        this.mainApp = mainApp;
    }

在加载Controller和FXML时,设置mainApp引用:

LoginController controller = loader.getController();
controller.setMainApp(this);

最后,当您登录应用程序时,如果可以,只需将用户存储在mainApp用户中:

    Person loginUser = new Person();
    loginUser.setUserName(txtUserName.getText());
    loginUser.setSomeUsefulValue(txtBlablabla.getText());
    mainApp.setUser(loginUser);

就是这样,现在您可以使用主类中的getCurrentUser()从任何地方调用用户数据。

希望这对您有所帮助。