Невозможно получить объект в определенном индексе в Java [duplicate]

Я создаю простой проект Android, который содержит логин Activity . Проблема в том, что я пытался достичь объекта в определенном индексе и пытался for цикл, но он всегда возвращает последний объект в последовательности.

 public Result<LoggedInUser> login (String username, String password){

    try {
        // TODO: handle loggedInUser authentication
        GetData myData = new GetData();
        usersdata = myData.getUsers();
        for (User user : usersdata) {
            if (user.UserName.trim() == username && user.Password.trim() == password) {
                LoggedUser = user;
            } else LoggedUser = null;
        }

        return new Result.Success<>(LoggedUser);
    } catch (Exception e) {
        return new Result.Error(new IOException("Error logging in", e));
    }
}

Всего 3 ответа


У вашего кода есть три проблемы:

  1. Сравнение строк с использованием == который сравнивает ссылки, а не содержимое строк
  2. Не прерывая цикл, когда ожидаемый результат найден.
  3. Выполнение LoggedUser=null; в else части, if вы сравниваете строки. В результате этого LoggedUser устанавливается в LoggedUser даже когда LoggedUser результат находится в любой позиции, кроме последней позиции. Вы должны сделать это после завершения цикла.

Сделайте это следующим образом:

public Result<LoggedInUser> login(String username, String password) {
    boolean found = false;
    try {
        // TODO: handle loggedInUser authentication
        GetData myData=new GetData();
        usersdata=myData.getUsers();
        for (User user:usersdata) {
            if(user.UserName.trim().equals(username) && user.Password.trim().equals(password)){
                LoggedUser=user;
                found = true;
                break;
            } 
        }
        if(!found) {
            LoggedUser=null;
        }
        return new Result.Success<>(LoggedUser);    
    } catch (Exception e) {
        return new Result.Error(new IOException("Error logging in", e));
    }
}

Мы используем .equals со строками при сравнении ссылок:

    public Result<LoggedInUser> login(String username, String password) {

    try {
        // TODO: handle loggedInUser authentication
        GetData myData=new GetData();
        usersdata=myData.getUsers();
        for (User user:usersdata) {

   if(user.UserName.trim().equals(username)&&user.Password.trim().equals(password)){
                LoggedUser=user;
            }
            else LoggedUser=null;
        }

        return new Result.Success<>(LoggedUser);
    } catch (Exception e) {
        return new Result.Error(new IOException("Error logging in", e));
    }
}

Убедись в том, что

username != null && password != null

Затем используйте .equals () для сравнения строк (не ==)

user.UserName.trim().equals(username.trim())&&user.Password.trim().equals(password.trim())

Причина, по которой вы получили последнего пользователя в последовательности, могла заключаться в том, что оба пользователя были нулевыми, потому что тогда оператор if принимал бы значение true для каждой итерации цикла.


Есть идеи?

10000