2013-07-02 2 views
0

Edit: Это, вероятно, очень плохой код в PasswordVerifier.JavaPassword Verifier Выпуск

Я делаю пароль верификатор, который проверяет, является ли введенный пароль длиной не менее 6 символов, имеет заглавную букву, строчную , и цифрой.

Я думаю, что у меня есть логистика его несколько правильная, но по какой-то причине моя программа не подходит к следующему приглашению. Он запрашивает мой пароль, а затем вешает трубку и не говорит мне, действительно ли мой пароль или нет. Я думаю, что мои петли верны, поэтому я не знаю, в чем моя проблема.

PasswordVerifier.Java

import java.util.*; 

public class PasswordVerifier{ 

    //field 
    private static int MIN_PASSWORD_LENGTH = 6; 

    //methods 
    public static boolean isValid(String str){ 

     boolean valid = false; 

     PasswordVerifier pass = new PasswordVerifier(); 

     if(pass.hasUpperCase(str)|| pass.hasLowerCase(str) || pass.hasDigit(str)){ 
      valid = true; 
     } 

     if (str.length() < 6){ 
      valid = false; 
     } 

     return valid; 

    } 

    //UpperCase Boolean check 
    private boolean hasUpperCase(String str){ 

     boolean valid = false; 

     int i = 0; 

     while (i < str.length()){ 
      if (Character.isUpperCase(str.charAt(i))) 
      valid = true; 
     } 
     i++; 

     return valid; 
    } 

    //Lowercase Boolean Check 
    private boolean hasLowerCase(String str){ 

     boolean valid = false; 

     int i = 0; 

     while (i < str.length()){ 
      if (Character.isLowerCase(str.charAt(i))) 
      valid = true; 
     } 
     i++; 

     return valid; 
    } 

    //Number boolean check 
    private boolean hasDigit(String str){ 

     boolean valid = false; 

     int i = 0; 

     while (i < str.length()){ 
      if ((Character.isDigit(str.charAt(i)))) 
      valid = true; 
     } 
     i++; 

     return valid; 

    } 

} 

PasswordDemo.Java

import javax.swing.JOptionPane; 

public class PasswordDemo{ 

    public static void main(String[] args){ 

     String input; //To hold the user's input 

     input = JOptionPane.showInputDialog("Enter a Password"); 

      if (PasswordVerifier.isValid(input)){ 
       JOptionPane.showMessageDialog(null, "Valid Password"); 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "invalid Password, try again."); 
      }   

    } 
} 

ответ

5

Ваших while петли никогда не увеличивает i, потому что вы разместили i++ только после конца цикла. Результатом является бесконечный цикл и «зависание», которое вы описываете.

E.g. заменить

while (i < str.length()){ 
    if (Character.isUpperCase(str.charAt(i))) 
    { 
     valid = true; 
     // Added break because we found an uppercase letter already. 
     break; 
    } 
    i++; // Inside the while loop. 
} 

Вам нужно сделать аналогичные изменения в каждый из ваших while петель.

Кроме того, если вы хотите обеспечить все 3 положения, не следует использовать логический оператор ИЛИ-||, используйте логическое и &&:

if (pass.hasUpperCase(str) && pass.hasLowerCase(str) && pass.hasDigit(str)) { 
    valid = true; 
} 

Это позволит убедиться, что пароль имеет верхний регистр письмо и у него строчная буква и у него есть цифра.

+0

Ничего себе, спасибо. Это сработало! – iamgod

+0

btw вы можете использовать простой код 'valid = pass.hasUpperCase (str) && pass.hasLowerCase (str) && pass.hasDigit (str);' – nachokk

0

Я думаю, ваша проблема в том, что вы считаете i ++ вне цикла while. Положите его в то время как это:

private boolean hasUpperCase(String str){ 

    boolean valid = false; 

    int i = 0; 

    while (i < str.length()){ 
     if (Character.isUpperCase(str.charAt(i))) 
     valid = true; 
     i++; 
    } 

    return valid; 
} 

Это проблема в каждом цикле, пока вы получили.

0

Прямо сейчас вы делаете три прохода через пароль, чтобы проверить условия трех символов - вы можете сконденсировать это на один проход. Кроме того, вы проверяете длину пароля последним - сначала вы должны проверить это, так как это самое быстрое условие для проверки.

public static boolean isValid(String str) { 
    if(str.length() < 6) return false; 
    int i = 0; 
    boolean hasDigit = false; 
    boolean hasLower = false; 
    boolean hasUpper = false; 
    while(i < str.length() && !hasDigit && !hasLower && !hasUpper) { 
     if(Character.isDigit(str.charAt(i))) { 
      hasDigit = true; 
     } else if(Character.isLowerCase(str.charAt(i))) { 
      hasLower = true; 
     } else if(Character.isUpperCase(str.charAt(i))) { 
      hasUpper = true; 
     } 
     i++; 
    } 
    return hasDigit && hasUpper && hasLower; 
} 

В вашем случае прирост производительности, вероятно, незначительно, но имейте это в виду на будущее, когда вы можете иметь дело с более чем трех условий и строки (или любой другой) с длиной гораздо больше, чем шесть.