2016-02-11 56 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);爲簡單起見。