【问题标题】:Java Why this for each loop doesnt work? [duplicate]Java为什么每个循环都不起作用? [复制]
【发布时间】:2016-11-12 10:01:01
【问题描述】:

我想在注册新用户时检查用户名是否已被使用,所以我有一个带有Vector<Users> 的类,我在其中保存所有用户及其参数。但是当我使用我的函数usernameExist(String nuovo) 时,它只将列表中的第一个用户名与我插入的字符串进行比较。我还实现了Serializable 接口,所以我每次都可以加载我的用户列表,但它工作正常。如果我使用迭代器来读取所有列表,我没有问题,但是使用 for-each 循环的每个函数都不起作用。

 //Constructor
 public UsersList()
 {
     list = new Vector<User>();
 }

 //The method i use to check if the username exist
 public boolean usernameExist(String nuovo)
 {
    for(User user : lista)
    {
        return user.matchUsername(nuovo);
    }
    return false;
 }

 //In the class User
 //Constructor of User
 public User(String nome, String cognome, String email, String  username, String password)
 {
    //Variable initialization
 }

 public boolean matchUsername(String inserted)
 {
    return username.equalsIgnoreCase(inserted);
 }

这让我发疯了 :D,谢谢你的帮助!

【问题讨论】:

  • 几乎总是这样,您可以通过在调试器中单步执行此代码来了解它的运行方式。使用调试器不是一项高级技能,而是一项应该尽快学习和使用的基本技能。
  • 通常,当您使用新的包或技术时,似乎这种新技术一定是您的问题的原因,而您经常忘记了一些更基本的东西,例如使用if 语句。即这与序列化无关。
  • @T.J.Crowder 我认为 OP 错误地认为它与序列化有关,但看不到如何(因为它不是)。我通常建议 OP 使用调试器,但 OP 已经描述了无论如何你可以在调试器中看到的内容。调试器不会告诉您如何编写代码。 ;)
  • @PeterLawrey:不,但是如果您在调试器中运行它并在第一次迭代时跳过该 return 语句并发现自己离开了该函数,那么这是一个关于问题所在的重要线索。 :-)
  • @TJCrowder OP 已经注意到“仅将列表中的第一个用户名与字符串进行比较”但是你是对的,在调试器中应该需要几秒钟的时间才能完成,而时间要少得多例如,比写这个问题。 ;)

标签: java loops serialization foreach deserialization


【解决方案1】:

在您的循环中,您总是在第一次迭代时返回:

for (User user : lista) {
    return user.matchUsername(nuovo); //always stops here
}

你想要的只是在 true 时返回:

for (User user : lista) {
    if (user.matchUsername(nuovo)) {
        return true; // stops only when true
    }
}

【讨论】:

    【解决方案2】:

    到达的第一个return语句将再次退出方法,因此每当您到达lista中的第一个元素时,它将返回:

    for(User user : lista)
    {
       return user.matchUsername(nuovo);
    }
    return false;
    

    你可以通过使用像这里这样的 if 条件来解决这个问题:

    for(User user : lista)
    {
       if(user.matchUsername(nuovo))
       {
           return true;
       }
    }
    return false;
    

    这意味着只有当user.matchUsername(nuovo)返回true时,才会执行return语句。

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多