Skip to content
Advertisement

Can’t display the strength of password

For my password strength checker, I am unable to display the score that I get from the password that I enter. Here is the code below, the problem is displayed all the way at the bottom of my code:

import java.lang.Thread.State;
import java.util.Scanner;


public class PasswordUtils {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("Password to test: ");
    String pw = sc.nextLine();
    
    if (containsUpperCase(pw)) {
        System.out.println("   ...contains an upper case letter");
    }
    if (containsLowerCase(pw)) {
            System.out.println("   ...contains an lower case letter");
    }
    if (containsDigit(pw)) {
                System.out.println("   ...contains a number");
    }
    if (containsSpecial(pw)) {
        System.out.println("   ...contains a number");
    }
    sc.close();

}

/** * Determine if the given string contains an upper case letter * @param s the string to check * @return true if and only if s contains an upper case letter */

public static boolean containsUpperCase(String s) {
    for (int letter=0; letter<s.length(); letter++) {
        if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(s.charAt(letter))>=0) {
            return true;
        }
    }
    return false;
}


public static boolean containsLowerCase(String s) {
        for (int letter=0; letter<s.length(); letter++) {
         if ("abcdefghijklmnopqrstuvwxyz".indexOf(s.charAt(letter))>=0) {
                        return true;
        }
    }
    return false;
}

public static boolean containsDigit(String s) {
    for (int letter=0; letter<s.length(); letter++) {
     if ("1234567890".indexOf(s.charAt(letter))>=0) {
                    return true;
    }
}
return false;

}

public static boolean containsSpecial(String s) {
    for (int letter=0; letter<s.length(); letter++) {
     if ("!@#$%^&*()_-+=[]{};:,.<>?/|".indexOf(s.charAt(letter))>=0) {
                    return true;
    }
}
return false;

}

/**
 * Determine the actual strength of a password based upon various tests
 * @param s the password to evaluate
 * @return the strength (on a 1 to 5 scale, 5 is very good) of the password
 */
public static int score(String s) {
      int pwscore = 0;
      
      //if it contains one digit, add 1 to total score
      if( s.matches("(?=.*[0-9]).*") )
          pwscore += 1;
      
      //if it contains one lower case letter, add 1 to total score
      if( s.matches("(?=.*[a-z]).*") )
          pwscore += 1;
      
      //if it contains one upper case letter, add 1 to total score
      if( s.matches("(?=.*[A-Z]).*") )
          pwscore += 1;    
      
      //if it contains one special character, add 1 to total score
      if( s.matches("(?=.*[~!@#$%^&*()_-]).*") )
          pwscore += 1;
      
      System.out.println("The password strength is " + pwscore);
      
    return pwscore;    // Right now, all passwords stink!!!
}

}

Advertisement

Answer

Instead of re-implementing the tests, and you say you already have functional code – I’d prefer that, like –

public static int score(String pw) {
    int score = 1; // <-- 1 to 5...
    if (containsUpperCase(pw)) {
        score++;
    }
    if (containsLowerCase(pw)) {
        score++;
    }
    if (containsDigit(pw)) {
        score++;
    }
    if (containsSpecial(pw)) {
        score++;
    }
    return score;
}

And then call it and print the result in main like

System.out.println("The score is " + score(pw));
Advertisement