有 Java 编程相关的问题?

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

Java的“while”循环问题

我想做的是从用户那里得到一个密码,然后检查它是否有4个条件。如果是对的话。然后打印出“密码正确”。如果不是,则向用户显示错误并返回菜单。问题是我不能回到菜单上去。如果我在第^{行执行while循环。它确实会返回,但某些“if”语句不会运行。有人能看到我被困在哪里吗?多谢各位

import java.util.Scanner;

public class Text_processing
{

    public static void main(String[] args)
    {
        Scanner kb = new Scanner(System.in);        //user input        
        String user_input;      // To hold input
        char[] array;           //Array for user_input
        int letters = 0;        // Number of letters
        int digits = 0;         // Number of digits
        boolean nu = true;      //
        boolean nl = true;
        boolean nd = true;
        boolean n7 = true;


        //User interface
        //suppose to put a while loop here, but.....
        System.out.println();
        System.out.println("Please create a password and a legal one" 
                           + " should contain the following elements:");
        System.out.println("\tAt least 7 characters in length.");
        System.out.println("\tAt least 1 upper case letter.");
        System.out.println("\tAt least 1 lower case letter.");
        System.out.println("\tAt least 1 number.");

        //Get a string from the user
        user_input = kb.nextLine();

        //Convert it to a char array
        array = user_input.toCharArray();

        for(int i = 0; i < array.length; i++)
        {
            if(!nu && !nl && !nd && !n7)
            {               
                break;
            }

            if (array.length >= 7)       //not < 7 cos breaks
            {         
                n7 = false;        
            }

            if(Character.isUpperCase(array[i]))
            {
                nu = false;             
            }

            if (Character.isLowerCase(array[i])) 
            {
                nl = false;
            }

            if (Character.isDigit(array[i])) 
            {
                nd = false;       
            }

        }

        if(n7)
        {
            System.out.println("Password does not contain 7 or more letters.");
        }
        if(nu)
        {
            System.out.println("Password does not contain an upper case letter.");
        }
        if(nl)
        {
            System.out.println("Password does not contain an lower case letter.");
        }
        if(nd)
        {
            System.out.println("Password does not contain a number.");
        }

            System.out.println("Password is correct.");


    }
}

共 (6) 个答案

  1. # 1 楼答案

    我个人觉得您编写的代码太长,无法进行如此简单的检查

    但问题仍然是,只有当您可以设置while循环来检查有效标志是否为true并在最后读取键盘输入时,才能修复hand

    类似下面的代码:

    boolean valid = false;
    while (!valid) {
    
            for (int i = 0; i < array.length; i++) {
                valid = true;
                if (!nu && !nl && !nd && !n7) {
                    break;
                }
    
                if (array.length >= 7) // not < 7 cos breaks
                {
                    n7 = false;
                }
    
                if (Character.isUpperCase(array[i])) {
                    nu = false;
                }
    
                if (Character.isLowerCase(array[i])) {
                    nl = false;
                }
    
                if (Character.isDigit(array[i])) {
                    nd = false;
                }
    
            }
    
            if (n7) {
                valid = false;
                System.out
                        .println("Password does not contain 7 or more letters.");
            }
            if (nu) {
                valid = false;
                System.out
                        .println("Password does not contain an upper case letter.");
            }
            if (nl) {
                valid = false;
                System.out
                        .println("Password does not contain an lower case letter.");
            }
            if (nd) {
                valid = false;
                System.out.println("Password does not contain a number.");
            }
            if (!valid) {
                user_input = kb.nextLine();
                array = user_input.toCharArray();
            }
        }
    
  2. # 2 楼答案

    编写一个简单的方法来验证密码,如下所示

    private static boolean isValid(char[] array) {
        if(array.length<7){
            return false;
        }
        else{
            boolean isUpper=false, isLower=false, isDigit=false;
            for (int i = 0; i < array.length; i++) {
                char c = array[i];
                if(Character.isUpperCase(c)){
                    isUpper=true;
                }
                if(Character.isLowerCase(c)){
                    isLower=true;
                }
                if(Character.isDigit(c)){
                    isDigit=true;
                }
            }
            return isUpper && isLower && isDigit;
        }
    }
    
  3. # 3 楼答案

    while循环从以下位置开始有什么问题:

    String user_input;      // To hold input
    

    并在以下时间之前结束:

            System.out.println("Password is correct.");
    
  4. # 4 楼答案

    为什么你要去的具体原因,你已经显示了内容,密码应该是什么

    只需打印“密码不符合上述条件,请重试”

    我觉得足够了

  5. # 5 楼答案

    这种情况的标准模式是:

    Scanner sc = new Scanner(System.in);
    String userInput = null;
    while (true) {
        System.out.println("please enter something:");
        userInput = sc.next();
        if (<input fails some test>) {
            System.out.println("some reason");
            continue; // try again
        }
        // repeat other tests similarly
        break; // will only get to here if input was OK
    }
    

    在输入有效输入之前,循环无法退出,在此之后userInput将保留该值

    还要注意,通过将提示放在循环中,可以避免无效输入上的代码重复

  6. # 6 楼答案

    在当前代码中,需要确保在主循环的每次迭代中重置nunlndn7

    boolean badPassword = false;
    do {
        boolean nu = true;
        boolean nl = true;
        boolean nd = true;
        boolean n7 = true;
        /*
         * Add everything from your code that appears below `boolean n7 = true;`
         * and above System.out.println("Password is correct."); here...
         */
    
        badPassword = (n7 || nu || nl || nd);
    } while (badPassword);
    System.out.println("Password is correct.");