2016-03-24 279 views
1

我似乎遇到了一些與我的程序有關的問題。我建議我的老師使用do while循環來保持程序運行。但是,當我輸入無效密碼並重新啓動時,它會出錯。當我輸入一個有效的密碼時,它只會打印「有效密碼」並且不是循環。我哪裏錯了?在while while循環中正確循環的問題 - Java

import java.util.Scanner; 

public class CovenduniteProg5_FIX { 

    public static void main(String[] args)  { 
     boolean passwordValid = false; 

     do { 
      boolean invalidLength = false; 
      boolean containsRestrictedWord = false; 
      boolean containsLowerCaseLetter = false; 
      boolean containsUpperCaseLetter = false; 
      boolean containsDigit = false; 
      boolean containsSpecialChar = false; 

      Scanner stdIn = new Scanner(System.in); 

      System.out.println("Password Verifier"); 
      System.out.println("\nEnter a password that meets the following rules:\n" + 
       "\tIs at least 8 characters long\n" + 
       "\tContains at least 1 lower letter character\n" + 
       "\tContains at least 1 upper letter character\n" + 
       "\tContains at least 1 numberic digit\n" + 
       "\tContains at least 1 special character from the set: [email protected]#$%^&*\n" + 
       "\tDoes not contain the word \"and\" or the word \"the\"\n"); 
      System.out.print("Enter your password: "); 
      String password = stdIn.nextLine(); 

      for (int i = 0; i < password.length(); i++) { 
       char ch = password.charAt(i); 

       if (Character.isUpperCase(ch) && !containsUpperCaseLetter) { 
        containsUpperCaseLetter = true; 
       } 

       if (Character.isLowerCase(ch) && !containsLowerCaseLetter) { 
        containsLowerCaseLetter = true; 
       } 

       if (Character.isDigit(ch) && !containsDigit) { 
        containsDigit = true; 
       } 

       if ((ch == '!' || ch == '@' || ch == '#' || ch == '$' || ch == '%' || ch == '^' || ch == '&' || ch == '*') && !containsSpecialChar) { 
        containsSpecialChar = true; 
       } 
      } 

      if (password.length() < 8) { 
       invalidLength = true; 
      } 

      if (password.contains("and") || password.contains("the")) { 
       containsRestrictedWord = true; 
      } 

      if (invalidLength) { 
       System.out.println("Invalid: Invalid length"); 
      } 

      if (containsRestrictedWord) { 
       System.out.println("Invalid: Contains either the word \"and\" or \"the\"."); 
      } 

      if (!containsDigit) { 
       System.out.println("Invalid: Does not contain at least one digit."); 
      } 

      if (!containsLowerCaseLetter) { 
       System.out.println("Invalid: Does not contain at least one lowercase letter."); 
      } 

      if (!containsUpperCaseLetter) { 
       System.out.println("Invalid: Does not contain at least one uppercase letter."); 
      } 

      if(!containsSpecialChar) { 
       System.out.println("Invalid: Does not contain at least one special character."); 
      } 

      if (containsSpecialChar && containsUpperCaseLetter && containsLowerCaseLetter && containsDigit && !containsRestrictedWord && !invalidLength) 
       passwordValid = true; 

      if (passwordValid) 
       System.out.print("\nPassword is valid."); 

     } while (!passwordValid); 

     passwordValid = false; 

     while(!passwordValid) { 
      if (passwordValid) 
       System.out.print("\nPassword is valid."); 
     } 
    } 
} 
+0

會發生這種情況對任何形式的 「無效」 的密碼? –

+0

我不知道我做了什麼才能讓它做到這一點。我似乎無法複製它。只有當你輸入一個「無效」密碼時,它似乎只能作爲循環工作。如果您輸入有效的密碼,則不會循環回到開始菜單。 – asfsafafaffwqfqwfwqqwg

+1

順便說一句,那些「&&!」聲明並沒有真正做任何事情。沒有理由不讓它將真實值分配給真正的值。但是,對於教育,如果將它們放在相反的順序中,那實際上會做些什麼 - 如果第一個子句爲假,Java將不會計算&&操作的第二個子句。這裏沒有關係,但有時候這很有用。 –

回答

0

你把do-while之外的最後一個passwordValid = false;時,你只是應該在循環之前有一次。而且你也不需要第二while(!passwordValid)循環:

boolean passwordValid = false; //← only here 
do { 
    boolean invalidLength = false; 
    boolean containsRestrictedWord = false; 
    boolean containsLowerCaseLetter = false; 
    boolean containsUpperCaseLetter = false; 
    boolean containsDigit = false; 
    boolean containsSpecialChar = false; 

    Scanner stdIn = new Scanner(System.in); 

    /* 

    ... 

    */ 

    if (/*All sub-conditions met*/) 
     passwordValid = true; 

    if (passwordValid) 
     System.out.print("\nPassword is valid."); 
} 
while (!passwordValid); 
//passwordValid = false; ← remove this 

//no need for while or if statment, because you can only reach this code if passwordValid = true 
System.out.print("\nPassword is valid."); 
+0

做出以下更改之後: 線程「main」中的異常java.lang.Error:未解決的編譯問題: \t passwordValid無法解析爲變量 – asfsafafaffwqfqwfwqqwg

0

我們不需要第二while環,它基本上是一個infinite loop。此外,我們需要將while循環之外的「密碼驗證程序」語句移動,因爲它們不需要多次打印。所以,該方法看起來像這樣:

public static void main(String[] args) { 

    boolean passwordValid = false; 
    System.out.println("Password Verifier"); 
    System.out.println("\nEnter a password that meets the following rules:\n" + "\tIs at least 8 characters long\n" 
      + "\tContains at least 1 lower letter character\n" + "\tContains at least 1 upper letter character\n" 
      + "\tContains at least 1 numberic digit\n" 
      + "\tContains at least 1 special character from the set: [email protected]#$%^&*\n" 
      + "\tDoes not contain the word \"and\" or the word \"the\"\n"); 
    do { 
     boolean invalidLength = false; 
     boolean containsRestrictedWord = false; 
     boolean containsLowerCaseLetter = false; 
     boolean containsUpperCaseLetter = false; 
     boolean containsDigit = false; 
     boolean containsSpecialChar = false; 

     Scanner stdIn = new Scanner(System.in); 

     System.out.print("Enter your password: "); 
     String password = stdIn.nextLine(); 

     for (int i = 0; i < password.length(); i++) { 
      char ch = password.charAt(i); 

      if (Character.isUpperCase(ch) && !containsUpperCaseLetter) { 
       containsUpperCaseLetter = true; 
      } 

      if (Character.isLowerCase(ch) && !containsLowerCaseLetter) { 
       containsLowerCaseLetter = true; 
      } 

      if (Character.isDigit(ch) && !containsDigit) { 
       containsDigit = true; 
      } 

      if ((ch == '!' || ch == '@' || ch == '#' || ch == '$' || ch == '%' || ch == '^' || ch == '&' 
        || ch == '*') && !containsSpecialChar) { 
       containsSpecialChar = true; 
      } 
     } 

     if (password.length() < 8) { 
      invalidLength = true; 
     } 

     if (password.contains("and") || password.contains("the")) { 
      containsRestrictedWord = true; 
     } 

     if (invalidLength) { 
      System.out.println("Invalid: Invalid length"); 
     } 

     if (containsRestrictedWord) { 
      System.out.println("Invalid: Contains either the word \"and\" or \"the\"."); 
     } 

     if (!containsDigit) { 
      System.out.println("Invalid: Does not contain at least one digit."); 
     } 

     if (!containsLowerCaseLetter) { 
      System.out.println("Invalid: Does not contain at least one lowercase letter."); 
     } 

     if (!containsUpperCaseLetter) { 
      System.out.println("Invalid: Does not contain at least one uppercase letter."); 
     } 

     if (!containsSpecialChar) { 
      System.out.println("Invalid: Does not contain at least one special character."); 
     } 

     if (containsSpecialChar && containsUpperCaseLetter && containsLowerCaseLetter && containsDigit 
       && !containsRestrictedWord && !invalidLength) 
      passwordValid = true; 

     if (passwordValid) 
      System.out.print("\nPassword is valid."); 

    } while (!passwordValid); 
} 
0

以下代碼將做你所問。有些事情要考慮:

  • 第二個while循環是無限的。
  • 在do循環之外聲明掃描器...每次創建一個可能會導致問題,您只需要聲明並創建一次。
  • 使用兩個do循環,外部循環具有無限的條件,所以它將永遠持續下去......您可以重寫以某種方式終止。
  • 外部循環顯示您的菜單。
  • 內部循環完成您所有的掃描儀/輸入和驗證和確定。

希望這有助於

// CovenduniteProg5_FIX 
public static void main(String[] args) { 
    boolean passwordValid = false; 
    Scanner stdIn = new Scanner(System.in); 

    do { 
     System.out.println("Password Verifier"); 
     System.out.println("\nEnter a password that meets the following rules:\n" 
       + "\tIs at least 8 characters long\n" + "\tContains at least 1 lower letter character\n" 
       + "\tContains at least 1 upper letter character\n" + "\tContains at least 1 numberic digit\n" 
       + "\tContains at least 1 special character from the set: [email protected]#$%^&*\n" 
       + "\tDoes not contain the word \"and\" or the word \"the\"\n"); 
     System.out.print("Enter your password: "); 

     do { 
      boolean invalidLength = false; 
      boolean containsRestrictedWord = false; 
      boolean containsLowerCaseLetter = false; 
      boolean containsUpperCaseLetter = false; 
      boolean containsDigit = false; 
      boolean containsSpecialChar = false; 

      try { 
       String password = stdIn.nextLine(); 

       for (int i = 0; i < password.length(); i++) { 
        char ch = password.charAt(i); 

        if (Character.isUpperCase(ch) && !containsUpperCaseLetter) { 
         containsUpperCaseLetter = true; 
        } 

        if (Character.isLowerCase(ch) && !containsLowerCaseLetter) { 
         containsLowerCaseLetter = true; 
        } 

        if (Character.isDigit(ch) && !containsDigit) { 
         containsDigit = true; 
        } 

        if ((ch == '!' || ch == '@' || ch == '#' || ch == '$' || ch == '%' || ch == '^' || ch == '&' 
          || ch == '*') && !containsSpecialChar) { 
         containsSpecialChar = true; 
        } 
       } 

       if (password.length() < 8) { 
        invalidLength = true; 
       } 

       if (password.contains("and") || password.contains("the")) { 
        containsRestrictedWord = true; 
       } 

       if (invalidLength) { 
        System.out.println("Invalid: Invalid length"); 
       } 

       if (containsRestrictedWord) { 
        System.out.println("Invalid: Contains either the word \"and\" or \"the\"."); 
       } 

       if (!containsDigit) { 
        System.out.println("Invalid: Does not contain at least one digit."); 
       } 

       if (!containsLowerCaseLetter) { 
        System.out.println("Invalid: Does not contain at least one lowercase letter."); 
       } 

       if (!containsUpperCaseLetter) { 
        System.out.println("Invalid: Does not contain at least one uppercase letter."); 
       } 

       if (!containsSpecialChar) { 
        System.out.println("Invalid: Does not contain at least one special character."); 
       } 

       if (containsSpecialChar && containsUpperCaseLetter && containsLowerCaseLetter && containsDigit 
         && !containsRestrictedWord && !invalidLength) 
        passwordValid = true; 

       if (passwordValid) 
        System.out.print("\nPassword is valid."); 

      } 
      catch (Exception ltheXcp) { 
       ltheXcp.printStackTrace(); 
      } 
     } while (!passwordValid); 

     passwordValid = false; 

    } while (1 != 2); 

//  while (!passwordValid) { 
//   if (passwordValid) 
//    System.out.print("\nPassword is valid."); 
//  } 
}