0

ねえ、私はプログラムが数字、文字、およびパスワードの長さをチェックすることを要求するパスワード検証プログラムを作成しています、そしてプログラムはそれらが一致するかどうか見るために2つのパスワードを比較します。すべて正常に動作しますが、エラーメッセージが表示されると、複数のメッセージボックスが表示されます。これがforループと関係があることは知っていますが、私はまだ初心者であり、修正する方法がわかりません。

これが私のコードです:

import javax.swing.JOptionPane;

public class Passwords
{
public static void main(String[] args)
{
    String passOne, passTwo;
    passOne = JOptionPane.showInputDialog(null, "Please enter a password");
    passTwo = JOptionPane.showInputDialog(null, "Please re-enter your password");




    //Loop for each digit in password
    for(int x = 0; x < passOne.length(); x++)
    {
        //Testing for a digit
        if(Character.isDigit(passOne.charAt(x)))
            {
                //Testing for a letter
                if(Character.isLetter(passOne.charAt(x)))
                {
                    //Testing length 6-10 chars
                    if(passOne.length() <= 10 && passOne.length() >= 6)
                    {
                        //comparing two passwords
                        if(passOne.equals(passTwo))
                        {
                            JOptionPane.showMessageDialog(null, "Contratulations, you have a new password!");
                        }
                        //If passwords don't match
                        else
                        {
                            JOptionPane.showMessageDialog(null, "Passwords do not match, please try again.");
                        }
                    }
                    //If length is wrong
                    else
                    {
                        JOptionPane.showMessageDialog(null, "Password must be between 6 and 10 characters long.");
                    }
                }
                //If no letter
                else
                {

                    JOptionPane.showMessageDialog(null, "Password must contain at least one letter.");
                }

            }
        //If no digit
        else
            {

                JOptionPane.showMessageDialog(null, "Password must contain at least one digit.");           
            }


    }


}
}
4

4 に答える 4

1

コードにいくつかの問題があります

  1. パスワードの文字を繰り返し処理していますが、各繰り返しでパスワード全体の長さを確認します。ループの外で、これを1回だけ実行する必要があります。passOneこれは、との同等性のチェックにも適用されますpassTwo

  2. コードを「アウトソーシング」して、次のように数字/文字をチェックします。

    static boolean containsOnlyDigitsOrLetters(String s)
    {
        for(int i = 0; i < s.length; i++)
        {
               if(!(Character.isLetter(s.charAt(i)) || Character.isDigit [...]))
               {
                   // if the current character is neither a letter nor a digit
                   return false;
               }
        }
        // all characters are either digits or letters
        return true;
    }
    

    「少なくとも1桁」/「少なくとも1文字」ではなく、「数字と文字のみを含む」のコードを意図的に投稿しました;)次に、次の擬似コードのように、コードをはるかに読みやすくすることができます。

    if password's length is not okay:
        display 'at least 6, at max 10'
    else if passwords do not match:
        [...]
    else if password does not contain a letter: // if(!containsAtLeastOneLetter(passOne))
        display 'use at least one letter'
    [....]
    
于 2013-01-30T18:11:27.340 に答える
0

これは、検証に失敗する原因となる各文字のエラーを表示しているためです。

解決策の要点は、エラーを見つけたらすぐにループから抜け出さなければならないということです。次に、実際にエラーが発生した場合(発生する前に記録した)、それを表示します。

私は実際にそれを実行しませんでしたが、もっと近いはずです、これを試してください:

    String error = null;
    // Loop for each digit in password
    for (int x = 0; x < passOne.length(); x++) {
        // Testing for a digit
        if (Character.isDigit(passOne.charAt(x))) {
            // Testing for a letter
            if (Character.isLetter(passOne.charAt(x))) {
                // Testing length 6-10 chars
                if (passOne.length() <= 10 && passOne.length() >= 6) {
                    // comparing two passwords
                    if (passOne.equals(passTwo)) {
                        error = "Contratulations, you have a new password!";
                    }
                    // If passwords don't match
                    else {
                        error = "Passwords do not match, please try again.";
                    }
                }
                // If length is wrong
                else {
                    error = "Password must be between 6 and 10 characters long.";
                }
            }
            // If no letter
            else {

                error = "Password must contain at least one letter.";
            }

        }
        // If no digit
        else {
            error = "Password must contain at least one digit.";
        }

        if(error != null) break;

    }

    if(error != null) {
        JOptionPane.showMessageDialog(null, error);           
    }

}
于 2013-01-30T18:09:32.333 に答える
0

forループからequalsチェックを取り除く必要があります。あなたは一度だけそれをする必要があります、今あなたはパス1の長さのためにやっています。

于 2013-01-30T18:09:46.940 に答える
0

明らかに、forループの問題は

文字列に数字が含まれているかどうかを確認する場合は、次のようにします。

Pattern.compile("[0-9]").matcher(passOne).find()

文字列に文字が含まれているかどうかを確認する場合:

Pattern.compile("[a-z]").matcher(passOne).find()

例えば:

import java.util.regex.Pattern;

import javax.swing.JOptionPane;

public class Main {

    public static void main(String[] args) {
        String passOne, passTwo;
        passOne = JOptionPane.showInputDialog(null, "Please enter a password");
        passTwo = JOptionPane.showInputDialog(null, "Please re-enter your password");


        //Testing for a digit
        if (Pattern.compile("[0-9]").matcher(passOne).find()) {
            //Testing for a letter
            if (Pattern.compile("[a-z]").matcher(passOne).find()) {
                //Testing length 6-10 chars
                if (passOne.length() <= 10 && passOne.length() >= 6) {

                    //comparing two passwords
                    if (passOne.equals(passTwo)) {
                        JOptionPane.showMessageDialog(null, "Contratulations, you have a new password!");

                    } //If passwords don't match
                    else {
                         JOptionPane.showMessageDialog(null, "Passwords do not match, please try again.");

                    }
                } //If length is wrong
                else {
                    JOptionPane.showMessageDialog(null, "Password must be between 6 and 10 characters long.");
                }
            } //If no letter
            else {
                JOptionPane.showMessageDialog(null, "Password must contain at least one letter.");
            }

        } //If no digit
        else {
           JOptionPane.showMessageDialog(null, "Password must contain at least one digit.");

        }


    }
}
于 2013-01-30T18:40:39.307 に答える