2016-03-24 19 views
1

私のプログラムにいくつか問題があるようです。インストラクターがdo whileループを使用してプログラムを実行し続けることを勧めました。しかし、無効なパスワードを入力して再起動するとエラーになります。有効なパスワードを入力すると、「有効なパスワード」のみが表示され、ではなく、ループになります。どこが間違っていたのですか?do 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

Btw、それらの "&&!"ステートメントは実際に何もしていません。すでに真の値を真に割り当てることができない理由はありません。しかし、教育の場合、それらを逆の順序に置くと、実際に何かが行われます.Javaは、最初の句がfalseの場合、&&操作の2番目の句を計算しません。これはここでは関係ありませんが、便利な場所があります。 –

答えて

0

あなただけのループの前に一度それを持っていなければならないときは、do-while外の最後passwordValid = false;を置きます。それは基本的にinfinite loopだ、私たちは二whileループを必要としない

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(!passwordValid)ループを必要としません。また、「Password Verifier」ステートメントは、複数回印刷する必要がないため、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

次のコードは、あなたが求めていることを行います。考慮する必要があるもの:

  • 2番目のwhileループは無限です。
  • doループの外でスキャナを宣言してください...毎回作成すると問題が発生する可能性があり、一度だけ宣言して作成する必要があります。
  • 2つの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."); 
//  } 
} 
関連する問題