brendan612
brendan612

Reputation: 307

Java.... Prints 1 error for each character in the input

Im a rookie Java coder, and I am trying to make a very basic username/password program. The username part of it is working fine, but when I get to the password it gives me some weird problems. I figured out that for example when it checks for an Uppercase letter, if it finds one its all good, but if it doesn't, it prints the error message for every single character in the password. It does this with the number check and the length check as well. If any of you guys could explain this to me rather simply since I am still new to java, that would be awesome. Thanks!

do
    {
        if (count3 >0)
        {
            System.err.println("- At least 1 Uppercase");
            System.err.println("- At least 1 number");
            System.err.println("- At least 7 characters long.");
        }
        regPassword = input.nextLine();
        regPasswordLen = regPassword.length();
        for(int count = 0; count < regPasswordLen; count++)
        {
                if(Character.isUpperCase(regPassword.charAt(count)))
                    regPasswordUppercaseCheck = true;

                    else
                    {
                        System.err.println("Your password did not contain an Uppercase letter");
                    regPasswordUppercaseCheck = false;
                    }

                if(regPassword.contains("1") || regPassword.contains("2") ||
                        regPassword.contains("3") || regPassword.contains("4") ||
                        regPassword.contains("5") || regPassword.contains("6") ||
                        regPassword.contains("7") || regPassword.contains("8") ||
                        regPassword.contains("9") || regPassword.contains("0"))
                    regPasswordNumCheck = true;

                    else
                    {
                        System.err.println("Your password did not contain at least 1 number.");
                    regPasswordNumCheck = false;
                    }

                if (regPasswordLen >=7)
                    regPasswordLengthCheck = true;

                    else
                    {
                        System.err.println("Your password did not meet the minimum length requirements.");
                    regPasswordLengthCheck = false;
                    }
        }
    count3++;
    }
    while(!regPasswordUppercaseCheck || !regPasswordNumCheck || !regPasswordLengthCheck); 

    System.out.println("test");

Upvotes: 1

Views: 100

Answers (3)

Faraz Sultan
Faraz Sultan

Reputation: 203

  1. You used same variable every time for "if and else" for every different char i.e. regPasswordUppercaseCheck, if every char of your input is in uppercase except the last char, the variable will contain false.
  2. I think you use count3 for making sure that inner code will run single time but if while goes false and count3 condition is remain true then code will stuck in a infinite loop.
  3. Use while(regPasswordUppercaseCheck && regPasswordNumCheck && regPasswordLengthCheck); for simplicity.

Upvotes: 1

achabahe
achabahe

Reputation: 2565

your checking for uppercase is not done right because the loop for(int count=0;count<regPasswordLength;count++) should not contain the checking if the password contains a number nor the checking if the password is longer than 7 characters so the loop should look like this

for (int count = 0; count < regPasswordLen; count++) {
                if (Character.isUpperCase(regPassword.charAt(count)))
                    {regPasswordUppercaseCheck = true;break;}
            }

i use break here to get out of the loop the moment i found that password contains an uppercase after some modifications your code can look like this

do {
            if (count3 > 0) {
                System.err.println("- At least 1 Uppercase");
                System.err.println("- At least 1 number");
                System.err
                        .println("- At least 7 characters long, but no more than 15 characters.");
            }
            regPassword = input.nextLine();
            regPasswordLen = regPassword.length();
            for (int count = 0; count < regPasswordLen; count++) {
                if (Character.isUpperCase(regPassword.charAt(count)))
                    {regPasswordUppercaseCheck = true;break;}
            }
                if(regPasswordUppercaseCheck==false){
                    System.err
                            .println("Your password did not contain an Uppercase letter");
                    regPasswordUppercaseCheck = false;
                }

                    regPasswordNumCheck = regPassword.contains("1") || regPassword.contains("2")
                            || regPassword.contains("3")
                            || regPassword.contains("4")
                            || regPassword.contains("5")
                            || regPassword.contains("6")
                            || regPassword.contains("7")
                            || regPassword.contains("8")
                            || regPassword.contains("9")
                            || regPassword.contains("0");

                if(regPasswordNumCheck==false) {
                    System.err
                            .println("Your password did not contain at least 1 number.");
                    regPasswordNumCheck = false;
                }

                if (regPasswordLen >= 7)
                    regPasswordLengthCheck = true;

                else {
                    System.err
                            .println("Your password did not meet the minimum length requirements.");
                    regPasswordLengthCheck = false;
                }

            count3++;
        } while (!regPasswordUppercaseCheck || !regPasswordNumCheck
                || !regPasswordLengthCheck);

        System.out.println("test");

Upvotes: 0

Chara
Chara

Reputation: 1075

A few things you can change in your program.

do
{
    if (count3 >0)
    {
        System.err.println("- At least 1 Uppercase");
        System.err.println("- At least 1 number");
        System.err.println("- At least 7 characters long, but no more than 15 characters.");
    }
    regPassword = input.nextLine();
    regPasswordLen = regPassword.length();

    // this check only needs to happen once per password, no need to check it in the for loop. You also specified that the length should not exceed 15 characters, so I threw that in as well
    if (regPasswordLen < 7 || regPasswordLen > 15)
         System.err.println("Your password did not meet the length requirements.");
    // by default, we set these flags to false, and only make them true if the requirements are satisfied
    regPasswordUppercaseCheck = false;
    regPasswordNumCheck = false;

    for(int count = 0; count < regPasswordLen; count++)
    {
            // store the value of regPassword.charAt(count) in a local variable for reusability
            char current = regPassword.charAt(count);

            if(Character.isUpperCase(current))
                regPasswordUppercaseCheck = true;

            // checks if the character is a digit or not
            if(current >= '0' && current <= '9')
                regPasswordNumCheck = true;
    }

    if (!regPasswordNumCheck)
        System.err.println("Your password did not contain at least 1 number.");
    if (!regPasswordUppercaseCheck)
        System.err.println("Your password did not contain an Uppercase letter");

count3++;
}
while(!regPasswordUppercaseCheck || !regPasswordNumCheck || !regPasswordLengthCheck);

Upvotes: 0

Related Questions