在嵌套 "if" 语句时跳出此 "for" 循环
Breaking out of this "for" loop while nested "if" statements
我正在尝试使用 break;
语句退出 for
循环。
final int NUM_USERS = 6; // Max Number of Users.
UserInfo[] users = new UserInfo[NUM_USERS]; // Array of Users.
int loginCounter = 0; // Counts bad login attempts.
int i = 0; // Loop index variable.
String userRole = ""; // Holds user's role text.
for (loginCounter = 1; loginCounter <= 3; ++loginCounter) {
// Get User's Credentials.
System.out.println("Enter Username: ");
String username = input.next().toLowerCase();
input.nextLine(); // Allows User to enter password.
System.out.println("Enter Password: ");
String password = input.nextLine();
String hash = sysLogin.convertToMd5(password);
for (i = 0; i < users.length; ++i) {
if (username.equals(users[i].getUsername())) {
if (hash.equals(users[i].getHash())) {
userRole = users[i].getRole();
sysLogin.goodLogin(); // Prints Good Login message.
break;
}
} else {
sysLogin.badLogin(); // Prints Bad Login message.
}
}
}
发生了什么:
代码将读入 username
和 password
,验证它是一个正确的登录,然后 return 再次询问用户名和密码。
预期会发生什么:
一旦成功登录,它将 userRole
设置为当前用户的角色,显示 goodLogin
消息,然后退出循环。
您可以附加标签并断开该标签 (Java example about labels in branches):
final int NUM_USERS = 6; // Max Number of Users.
UserInfo[] users = new UserInfo[NUM_USERS]; // Array of Users.
int loginCounter = 0; // Counts bad login attempts.
int i = 0; // Loop index variable.
String userRole = ""; // Holds user's role text.
OUTER:
for (loginCounter = 1; loginCounter <= 3; ++loginCounter) {
// Get User's Credentials.
System.out.println("Enter Username: ");
String username = input.next().toLowerCase();
input.nextLine(); // Allows User to enter password.
System.out.println("Enter Password: ");
String password = input.nextLine();
// Convert password to MD5 hash.
String hash = sysLogin.convertToMd5(password);
for (i = 0; i < users.length; ++i) {
if (username.equals(users[i].getUsername())) {
if (hash.equals(users[i].getHash())) {
userRole = users[i].getRole();
sysLogin.goodLogin(); // Prints Good Login message.
break OUTER;
}
else {
sysLogin.badLogin(); // Prints Bad Login message.
}
}
}
}
break
只会跳出迭代用户列表的内部 for 循环,而不是外部循环。
尝试做一些这样的事情
boolean login = false;
do {
// Get User's Credentials.
System.out.println("Enter Username: ");
String username = input.next().toLowerCase();
input.nextLine(); // Allows User to enter password.
System.out.println("Enter Password: ");
String password = input.nextLine();
// Convert password to MD5 hash.
String hash = sysLogin.convertToMd5(password);
for (i = 0; i < users.length; ++i) {
if (username.equals(users[i].getUsername())) {
if (hash.equals(users[i].getHash())) {
login = true;
userRole = users[i].getRole();
sysLogin.goodLogin(); // Prints Good Login message.
break;
} else {
sysLogin.badLogin(); // Prints Bad Login message.
}
}
}
} while ( login == false && failCondition == false );
您需要将失败计数重新添加到循环中,但这应该会给您带来更符合预期的结果。
break;
语句打破了最内层的循环;最外层的循环将继续执行。
在最外层的循环中,您可能希望有一个变量,例如 bool success = false;
。在进入最内层循环之前,分配 true
,并在最外层循环中进行检查,如:
if(success) break;
我正在尝试使用 break;
语句退出 for
循环。
final int NUM_USERS = 6; // Max Number of Users.
UserInfo[] users = new UserInfo[NUM_USERS]; // Array of Users.
int loginCounter = 0; // Counts bad login attempts.
int i = 0; // Loop index variable.
String userRole = ""; // Holds user's role text.
for (loginCounter = 1; loginCounter <= 3; ++loginCounter) {
// Get User's Credentials.
System.out.println("Enter Username: ");
String username = input.next().toLowerCase();
input.nextLine(); // Allows User to enter password.
System.out.println("Enter Password: ");
String password = input.nextLine();
String hash = sysLogin.convertToMd5(password);
for (i = 0; i < users.length; ++i) {
if (username.equals(users[i].getUsername())) {
if (hash.equals(users[i].getHash())) {
userRole = users[i].getRole();
sysLogin.goodLogin(); // Prints Good Login message.
break;
}
} else {
sysLogin.badLogin(); // Prints Bad Login message.
}
}
}
发生了什么:
代码将读入 username
和 password
,验证它是一个正确的登录,然后 return 再次询问用户名和密码。
预期会发生什么:
一旦成功登录,它将 userRole
设置为当前用户的角色,显示 goodLogin
消息,然后退出循环。
您可以附加标签并断开该标签 (Java example about labels in branches):
final int NUM_USERS = 6; // Max Number of Users.
UserInfo[] users = new UserInfo[NUM_USERS]; // Array of Users.
int loginCounter = 0; // Counts bad login attempts.
int i = 0; // Loop index variable.
String userRole = ""; // Holds user's role text.
OUTER:
for (loginCounter = 1; loginCounter <= 3; ++loginCounter) {
// Get User's Credentials.
System.out.println("Enter Username: ");
String username = input.next().toLowerCase();
input.nextLine(); // Allows User to enter password.
System.out.println("Enter Password: ");
String password = input.nextLine();
// Convert password to MD5 hash.
String hash = sysLogin.convertToMd5(password);
for (i = 0; i < users.length; ++i) {
if (username.equals(users[i].getUsername())) {
if (hash.equals(users[i].getHash())) {
userRole = users[i].getRole();
sysLogin.goodLogin(); // Prints Good Login message.
break OUTER;
}
else {
sysLogin.badLogin(); // Prints Bad Login message.
}
}
}
}
break
只会跳出迭代用户列表的内部 for 循环,而不是外部循环。
尝试做一些这样的事情
boolean login = false;
do {
// Get User's Credentials.
System.out.println("Enter Username: ");
String username = input.next().toLowerCase();
input.nextLine(); // Allows User to enter password.
System.out.println("Enter Password: ");
String password = input.nextLine();
// Convert password to MD5 hash.
String hash = sysLogin.convertToMd5(password);
for (i = 0; i < users.length; ++i) {
if (username.equals(users[i].getUsername())) {
if (hash.equals(users[i].getHash())) {
login = true;
userRole = users[i].getRole();
sysLogin.goodLogin(); // Prints Good Login message.
break;
} else {
sysLogin.badLogin(); // Prints Bad Login message.
}
}
}
} while ( login == false && failCondition == false );
您需要将失败计数重新添加到循环中,但这应该会给您带来更符合预期的结果。
break;
语句打破了最内层的循环;最外层的循环将继续执行。
在最外层的循环中,您可能希望有一个变量,例如 bool success = false;
。在进入最内层循环之前,分配 true
,并在最外层循环中进行检查,如:
if(success) break;