【问题标题】:Cannot get object in specific index in Java无法在 Java 中获取特定索引中的对象
【发布时间】:2020-03-25 20:02:53
【问题描述】:

我正在创建一个简单的 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));
    }
}

【问题讨论】:

  • 字符串与equals比较,而不是==
  • 并且else 块将被调用 - 一旦找到user 就跳出循环。
  • 它的 true 删除了 else 块

标签: java android sql database list


【解决方案1】:

您的代码存在三个问题:

  1. 使用 == 比较字符串,它比较的是引用而不是字符串的内容
  2. 在找到预期结果时不中断循环。
  3. 在您比较字符串的ifelse 部分执行LoggedUser=null;。因此,LoggedUser 被设置为null,即使在最后一个位置以外的任何位置找到预期结果。一旦循环终止,您应该这样做。

按如下方式进行:

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

【讨论】:

  • 感谢同性恋者,主要问题在于“usersdata”的初始化必须在循环内,因为这些错误数组由每个循环填充相同的值,我删除了 else 块,因为它破坏了我的代码
【解决方案2】:

在比较引用时,我们使用 .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));
    }
}

【讨论】:

    【解决方案3】:

    确保

    username != null && password != null
    

    然后使用 .equals() 比较字符串(不是 == )

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

    您收到序列中最后一个用户的原因可能是两个用户都为空,因为这样 if 语句将在循环的每次迭代中解析为 true。

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2016-11-24
      • 2012-11-25
      • 2015-09-12
      • 2016-04-02
      • 1970-01-01
      相关资源
      最近更新 更多