在嵌套的“if”语句中跳出“for”循环

4
我试图使用 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.
            }
        }
    }

正在发生什么:

代码将读取usernamepassword,验证其是否是良好的登录信息,然后再次要求输入用户名和密码。

预期发生的情况:

一旦成功登录,它会将userRole设置为当前用户的角色,显示goodLogin消息,然后退出循环。


你遇到了什么问题? - RaminS
你尝试过附加调试器并逐行步进代码以查看意外结果发生的位置吗? - Matt Clark
2
您的 break 语句仅会跳出最内层的 for 循环,即迭代用户列表的循环,它不会跳出外层的循环。 - Matt Clark
我正在使用NetBeans IDE,并且已经进行了多次调试。它输出了“Good Login”消息(我将编辑原帖),但忽略了break;break;语句是否也适用于if语句?我认为它们只适用于循环。 - Brandon P.
2
你的break语句会跳出其中一个for循环(遍历每个用户的那个),如果你想跳出主for循环,需要给它加上一个标签,并使用带有标签的break语句。label: for(...break label; - Deximus
我现在明白了。我盯着代码看了一个多小时,却没想起来我有一个嵌套的 for 循环。 - Brandon P.
3个回答

2
break只会跳出内部循环,即遍历用户列表的循环,而不是外部循环。尝试像这样做:
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 );

您需要将失败计数重新添加到循环中,但这应该可以给您提供更符合预期的结果。


1
break;语句中断最内层的循环;最外层的循环将继续执行。
在最外层循环中,您需要拥有一个变量,例如bool success = false;。在最内层循环中进行中断之前,赋值为true,并在最外层循环中进行检查: if(success) break;

1
你可以将标签和跳出指令(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.
            }
            }
        }
    }

哇...我很特别...现在我明白大家在说什么了。我忘了,我有一个嵌套的 for 循环。谢谢大家。标记问题已解决。 - Brandon P.
请不要使用依赖标签的80年代编码风格,这被认为是非常糟糕的做法,至少可以这么说。它还会使您的代码难以调试和难以维护(难以修改)长期运行。 - fps
@FedericoPeraltaSchaffner 这只是提供给代码的一个快速解决方案,我并不是要重构代码。实现示例中提供的逻辑有很多方法,但问题很明确——为什么提供的示例不起作用以及如何修复。 - ACV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接