2016-02-11 57 views
1

我是一个新手Java编程人员,我试图制作一个非常基本的用户名/密码程序。它的用户名部分工作正常,但当我得到密码时,它给我一些奇怪的问题。例如,当我们检查一个大写字母时,我发现它会发现一个很好的字母,但如果它没有,它会输出密码中每个字符的错误信息。它通过数字检查和长度检查来做到这一点。如果你们中的任何一个人可以向我解释这一点,而不是简单的,因为我还是Java新手,那真是太棒了。谢谢!Java ....为输入中的每个字符打印1个错误

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"); 
+0

您正在重置您的支票,并非所有这些条件同时为真。 –

+0

你似乎试图一次做所有事情。我建议你将你的代码分解成独立解决密码要求的每个部分的部分。一次解决每个小问题。增加可读性,使代码更易于开发和维护。 –

+0

为什么不简单地使用正则表达式而不是自己编码所有的检查? – Filip

回答

0

您可以在程序中更改一些东西。

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); 
0

您的大写检查不这样做的权利,因为循环 for(int count=0;count<regPasswordLength;count++)不应该包含检查,如果密码包含一个编号,也不检查密码是否超过7个字符长,因此该循环应该是这样的

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

我在这里使用突破摆脱循环的我发现,密码包含了一些修改后,一个大写的代码可以是这样的

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"); 
瞬间
1
  1. 您使用相同的变量每一次的“如果和其他人”为每一个不同的字符即regPasswordUppercaseCheck,如果输入的每一个字符是除最后一个字符大写,变量将包含错误。
  2. 我认为你使用count3来确保内部代码将运行一次,但如果while变为false且count3条件保持为true,那么代码将停留在无限循环中。
  3. 使用 而(regPasswordUppercaseCheck & & regPasswordNumCheck & & regPasswordLengthCheck);为简单起见。