有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图在从文本字段登录后获取用户名,并通过实例化“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) 个答案

  1. # 1 楼答案

    您没有实例化任何一个TextField对象,因此当您从CurrentUsername方法中调用对象“txtUsername”上的方法时,会抛出一个NullPointerException

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

    public LoginController() {
        txtUsername = new TextField();
        txtPassword = new TextField();
    }
    
  2. # 2 楼答案

    您正在调用控制器,然后中间调用用户,该用户为空

     LoginController loginController = new LoginController ();
    
     String User = loginController.CurrentUsername();
    

    编辑:

    我只需要创建一个带有属性、getter和setter的用户类,并从主类实例化它

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

    在登录控制器中,您需要有对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;
        }
    

    加载控制器和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()从任何地方调用用户数据

    我希望这能帮助你

  3. # 3 楼答案

    我觉得txtUsername是空的,因为你正面临NPE

    设置txtUsername的方式和位置

    尝试将你的方法CurrentUsername()更改为

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

    这样至少你不会有NPE。然后看看在哪里以及如何设置txtUsername