有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在嵌套“if”语句时打破了这个“for”循环

我试图使用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消息,然后退出循环


共 (3) 个答案

  1. # 1 楼答案

    break只会跳出内部for循环,而不是外部循环,在内部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 );
    

    您需要将失败计数重新添加到循环中,但这会给您带来更预期的结果

  2. # 2 楼答案

    break;语句打破了最内部的循环;最外层的循环将继续执行

    在最外层的循环中,需要一个变量,比如bool success = false;。在断开最内部的循环之前,分配true,并在最外部的循环中进行检查,如:

    if(success) break;

  3. # 3 楼答案

    可以附加一个标签并断开该标签(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.
                }
                }
            }
        }