Я не могу найти причину, по которой моя программа отправляет исключение - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь получить имя пользователя после входа в систему из текстового поля и перейти к другой сцене, создав новый объект класса «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 голосов
/ 03 декабря 2018

Я чувствую, что txtUsername не имеет значения, из-за чего вы находитесь перед NPE.

Как и где вы настраиваете txtUsername?

Попробуйте изменить свой метод CurrentUsername() на,

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

Таким образом, по крайней мере, у вас не будет NPE.Тогда посмотрите, где и как установить txtUsername.

0 голосов
/ 03 декабря 2018

Вы вызываете контроллер, а затем немедленно вызываете пользователя, который имеет значение null.

 LoginController loginController = new LoginController ();

 String User = loginController.CurrentUsername();

Редактировать:

Я бы просто создал класс User с атрибутами gettersи устанавливает и создает его из основного класса

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 User:

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

Вот и все, теперь вы можете вызывать данные пользователя из любого места, используя getCurrentUser () в основном классе.

Я надеюсьэто может вам помочь.

0 голосов
/ 03 декабря 2018

Вы не создали ни одного из объектов TextField, поэтому при вызове метода для объекта 'txtUsername' из метода CurrentUsername выбрасывается NullPointerException.

Одно решение вашей проблемыможет быть создан экземпляр объявленных объектов в конструкторе для класса LoginController, например:

public LoginController() {
    txtUsername = new TextField();
    txtPassword = new TextField();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...