为什么我的 for 循环只检查第一个元素?
Why does my for loop check only the first element?
我有这个方法可以在登录前检查用户的用户名和密码。现在我的 for 循环只检查第一个项目,它发现第一个条件 u.getRole().equalsIgnoreCase("recruiter")
不满足第一个项目,所以它没有去检查第二个项目,而是打破了 returns null。
为什么会这样?
这是我的方法:
public User check(String userName, String password) throws AdException {
try {
begin();
Query q = getSession().createQuery("from User");
ArrayList<User> list = (ArrayList<User>) q.list();
System.out.println("recruiterList is: " + list);
for (User u: list) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName 1 is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
System.out.println("After if recruiter is: " + u);
System.out.println("userName 2 is :" + u.getUserName());
return u;
}
break;
}
} catch (HibernateException e) {
rollback();
throw new AdException("Unfound " + userName, e);
}
return null;
}
嗯,这是有道理的,因为如果你成功了,你 return 如果你不成功,你就会失败,所以它会失败:
for (User u: list) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
// code which returns at the end
return u;
}
break;
}
只要不满足条件,就会执行 break;
语句(否则你会在到达条件之前 return
),这就是为什么你总是只检查第一项。
如果您想检查所有项目,只需从循环中删除 break;
语句。
您在循环中使用了 break
语句。这会导致循环退出。
正如评论中指出的那样,循环中只有两个选择,都可以使循环完成(在 return
或 break
上)只需取消 break;
语句或将其更改为 continue;
.
顺便问一下,你为什么不只select from User where role = 'recruiter'
?这将使到数据库服务器的往返行程不会到达 return 所有用户,而只会到达您感兴趣的用户。
for (User u: list) {
if (u.getRole().equalsIgnoreCase("recruiter")) {
//sysout
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
//2 sysout
return u;
}
break; //here break statement will exit your loop just after first Iteration.
}
所以试试这个代码。
for (User u: list) {
if (u.getRole().equalsIgnoreCase("recruiter")) {
//sysout
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)){
//2 sysout
return u;
} else{
//your code if password doesnot matched
}
// continue even if more than one recruiter type User Object are in Database.
}else{
//your code if user Role doesnot matched
}
} //loop will check all element present in that array. and if it's ROLE is matched like "Recuriter" then it will check user and password.
你的代码和逻辑是错误的。 u
在 for-each
循环的迭代期间不会改变,它会在每次迭代后改变。您的 println
语句表明您相信 u
会在第一个嵌套的 if
语句期间发生变化。自:
System.out.println("userName 1 is :" + u.getUserName());
和:
System.out.println("userName 2 is :" + u.getUserName());
出现在同一个if
块中,嵌套在for-each
循环中:
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName 1 is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
System.out.println("After if recruiter is: " + u);
System.out.println("userName 2 is :" + u.getUserName());
return u;
}
您也不需要使用 break
或 continue
语句。您不需要 break
语句,因为您有 return
语句。您不需要 continue
语句,因为循环就是这样做的。
另请注意,没有花括号的 if
语句 ({ ... }
) 仅执行其正下方的行。例如:
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
System.out.println("After if recruiter is: " + u);
您的代码应类似于:
public User check(String userName, String password) throws AdException {
try {
begin();
Query q = getSession().createQuery("from User");
ArrayList<User> list = (ArrayList<User>) q.list();
System.out.println("recruiterList is: " + list);
for (User u: list) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName 1 is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) {
System.out.println("After if recruiter is: " + u);
// System.out.println("userName 2 is :" + u.getUserName());
return u;
}
}
}
} catch (HibernateException e) {
rollback();
throw new AdException("Unfound " + userName, e);
}
return null;
}
如果您想要 println
语句输出当前用户名的索引是什么,那么不要使用 for-each
使用常规 for
循环。例如:
public User check(String userName, String password) throws AdException {
try {
begin();
Query q = getSession().createQuery("from User");
ArrayList<User> list = (ArrayList<User>) q.list();
System.out.println("recruiterList is: " + list);
for (int i = 0; i < list.length; i++) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName " + (i + 1) + " is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) {
System.out.println("After if recruiter is: " + u);
return u;
}
}
}
} catch (HibernateException e) {
rollback();
throw new AdException("Unfound " + userName, e);
}
return null;
}
我有这个方法可以在登录前检查用户的用户名和密码。现在我的 for 循环只检查第一个项目,它发现第一个条件 u.getRole().equalsIgnoreCase("recruiter")
不满足第一个项目,所以它没有去检查第二个项目,而是打破了 returns null。
为什么会这样?
这是我的方法:
public User check(String userName, String password) throws AdException {
try {
begin();
Query q = getSession().createQuery("from User");
ArrayList<User> list = (ArrayList<User>) q.list();
System.out.println("recruiterList is: " + list);
for (User u: list) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName 1 is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
System.out.println("After if recruiter is: " + u);
System.out.println("userName 2 is :" + u.getUserName());
return u;
}
break;
}
} catch (HibernateException e) {
rollback();
throw new AdException("Unfound " + userName, e);
}
return null;
}
嗯,这是有道理的,因为如果你成功了,你 return 如果你不成功,你就会失败,所以它会失败:
for (User u: list) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
// code which returns at the end
return u;
}
break;
}
只要不满足条件,就会执行 break;
语句(否则你会在到达条件之前 return
),这就是为什么你总是只检查第一项。
如果您想检查所有项目,只需从循环中删除 break;
语句。
您在循环中使用了 break
语句。这会导致循环退出。
正如评论中指出的那样,循环中只有两个选择,都可以使循环完成(在 return
或 break
上)只需取消 break;
语句或将其更改为 continue;
.
顺便问一下,你为什么不只select from User where role = 'recruiter'
?这将使到数据库服务器的往返行程不会到达 return 所有用户,而只会到达您感兴趣的用户。
for (User u: list) {
if (u.getRole().equalsIgnoreCase("recruiter")) {
//sysout
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
//2 sysout
return u;
}
break; //here break statement will exit your loop just after first Iteration.
}
所以试试这个代码。
for (User u: list) {
if (u.getRole().equalsIgnoreCase("recruiter")) {
//sysout
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)){
//2 sysout
return u;
} else{
//your code if password doesnot matched
}
// continue even if more than one recruiter type User Object are in Database.
}else{
//your code if user Role doesnot matched
}
} //loop will check all element present in that array. and if it's ROLE is matched like "Recuriter" then it will check user and password.
你的代码和逻辑是错误的。 u
在 for-each
循环的迭代期间不会改变,它会在每次迭代后改变。您的 println
语句表明您相信 u
会在第一个嵌套的 if
语句期间发生变化。自:
System.out.println("userName 1 is :" + u.getUserName());
和:
System.out.println("userName 2 is :" + u.getUserName());
出现在同一个if
块中,嵌套在for-each
循环中:
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName 1 is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
System.out.println("After if recruiter is: " + u);
System.out.println("userName 2 is :" + u.getUserName());
return u;
}
您也不需要使用 break
或 continue
语句。您不需要 break
语句,因为您有 return
语句。您不需要 continue
语句,因为循环就是这样做的。
另请注意,没有花括号的 if
语句 ({ ... }
) 仅执行其正下方的行。例如:
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
System.out.println("After if recruiter is: " + u);
您的代码应类似于:
public User check(String userName, String password) throws AdException {
try {
begin();
Query q = getSession().createQuery("from User");
ArrayList<User> list = (ArrayList<User>) q.list();
System.out.println("recruiterList is: " + list);
for (User u: list) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName 1 is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) {
System.out.println("After if recruiter is: " + u);
// System.out.println("userName 2 is :" + u.getUserName());
return u;
}
}
}
} catch (HibernateException e) {
rollback();
throw new AdException("Unfound " + userName, e);
}
return null;
}
如果您想要 println
语句输出当前用户名的索引是什么,那么不要使用 for-each
使用常规 for
循环。例如:
public User check(String userName, String password) throws AdException {
try {
begin();
Query q = getSession().createQuery("from User");
ArrayList<User> list = (ArrayList<User>) q.list();
System.out.println("recruiterList is: " + list);
for (int i = 0; i < list.length; i++) {
System.out.println("Before if user is: " + u);
if (u.getRole().equalsIgnoreCase("recruiter")) {
System.out.println("userName " + (i + 1) + " is :" + u.getUserName());
if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) {
System.out.println("After if recruiter is: " + u);
return u;
}
}
}
} catch (HibernateException e) {
rollback();
throw new AdException("Unfound " + userName, e);
}
return null;
}