0

このコード ブロックにバグがあります。デバッガーは、原因がこのコード行であることを示唆していますchar chr = getSecretWord.charAt(i);

userInputこのコードが行うことは、との間の一致を探すことですsecretWord。secretWordfor loopの文字の長さを 1 つずつ調べる必要があり、一致する文字があれば true を返します。そうでない場合は false を返します...しかし、単に false を返すと想定されると、プログラムがクラッシュします...この行で何かが起こっていると思いますが、正確にはわかりませんgetSecretWord.charAt(i);

    private boolean isMatchingSecretWord(String userInput)
{
    String secretWord = "";
    String getSecretWord = getSecretWord();
    for (int i = 0; i <= getSecretWord.length();i++)
        {
        char chr = getSecretWord.charAt(i);
        secretWord = ""+chr;

        if (secretWord.equals(userInput))
        {
            println("is true");
            return true;
        }
    }
    return false;
}

補足として、このコードで行ったことは正しいですか? getSecretWorld() メソッドを文字列に割り当てて、文字列メソッドを使用できるようにしlength()ますか

String getSecretWord = getSecretWord();

for (int i = 0; i <= getSecretWord.length();i++)

デバッグ コード:

Exception in thread "Thread-4" java.lang.StringIndexOutOfBoundsException: String index out of range: 4    
    at java.lang.String.charAt(String.java:686)    
    at Hangman.isMatchingSecretWord(Hangman.java:49)    
    at Hangman.userInput(Hangman.java:34)    
    at Hangman.run(Hangman.java:20)*
4

2 に答える 2

3
for (int i = 0; i <= getSecretWord.length(); i++)

次のようにする必要があります。

for (int i = 0; i < getSecretWord.length(); i++)
//               ^^^
//             see here

n-character文字列 (またはn-element 配列)の有効なインデックスは、0包括n-1的です。

したがって、合言葉がxyyzyの場合、有効なインデックスは 0 ~ 4 です。元のループiは 0 から5 に設定されているため、問題が発生します。


しかし、単純なもので済む場合でも、そこには不要なコードがたくさんあるようです。

まず、混乱の原因を取り除きます-関数名はユーザー入力のように聞こえ、秘密の単語は完全に一致する必要がありますが、コメントはそうではないことを示しています:

ありがとう、これはうまくいきます。しかし、ループの理由は、ユーザーが 1 つの文字を入力したためです。その文字が SecretWord 内にあるかどうかを確認したいのです。(絞首刑執行人ゲーム)。

その場合、合言葉に 1 文字が存在するかどうかを確認したいだけです。関数名を適切に変更しますが、それでも、はるかに少ないコードで実行できます。

private boolean isInSecretWord (String userInput) {
    String secretWord = getSecretWord();
    return secretWord.contains(userInput);
}
于 2012-09-18T01:59:15.203 に答える
1

forループが正しくループしていなかったため、範囲外エラーが発生していました。ループが範囲外にならないように変更しました。また、secretWord変数が正しく入力されていませんでした。コードは、意図したとおりに機能するはずです。 :)

private boolean isMatchingSecretWord(String userInput)
{
    String secretWord = "";
    String getSecretWord = getSecretWord();
    for (int i = 0; i < getSecretWord.length();i++)
        {
        char chr = getSecretWord.charAt(i);
        secretWord = secretWord + chr;

        if (secretWord.equals(userInput))
        {
            println("is true");
            return true;
        }
    }
    return false;
}
于 2012-09-18T02:05:19.700 に答える