0

私は AP コンピューター サイエンスのクラスで絞首刑執行人ゲームを作成していますが、文字列に関する問題を解決する方法がわかりませんでした。範囲外のインデックス エラーが発生しています。それは言う

java.lang.StringIndexOutOfBoundsException: 文字列インデックスが範囲外です: 7

ここで発生:

if(theGuess.equals(wordToGuess.substring(i,i+1)))

参考になる場合のプログラムコードは次のとおりです。

import javax.swing.JOptionPane; 
public class Hangman extends BasicGame
{
    private final String WORDCHOICES= "apple"+"great"+"zebra"+"mouse"+"chick"+"class"+"abhor"+"abide"
        +"fuzzy"+"brute"+"blunt"+"comic"+"cater"+"stone"+"chaos"+"dufus"+"earth"+"decal"+"happy"+"heist"
        +"idler"+"lions"+"hates"+"idols"+"lasso"+"lives"+"lisps"+"major"+"mound"+"mango"+"meter"+"mercy"
        +"marry"+"pilot"+"plots"+"pants"+"overt"+"quack"+"paver"+"polls"+"scorn"+"sapid"+"sails"+"rowdy"
        +"seeks"+"leech"+"seats"+"spade"+"shoes"+"slurp";
    private String wordToGuess;
    private java.util.Random randy;

    private int wordNum;
    private int numCorrect=0;
    private String[] correctLetters= new String[]{"","","","",""};
    HangDraw artist= new HangDraw();
    public Hangman()
    {
        super();
        randy= new java.util.Random();
        for(int i = 0; i<5;i++)
            correctLetters[i]=null;
        wordNum=0;
        numCorrect=0;
        artist.setUp();
    }
    public void guess()
    {
        wordNum= 5*randy.nextInt(50);
        numCorrect=0;
        int wrong=0;
        String userGuess="";
        int partsDrawn=0;
        wordToGuess=WORDCHOICES.substring(wordNum,wordNum+5)+" ";
        while(numCorrect<5&& partsDrawn<5)
        {
            userGuess= JOptionPane.showInputDialog("Guess a letter, so far you have: "+ correctLetters[0]+
                        correctLetters[1]+correctLetters[2]+correctLetters[3]+correctLetters[4]);

            if(checkLetter(userGuess))
            {
                JOptionPane.showMessageDialog(null, "Correct Guess");
                //print the letter
            }
            else
            {
                //draw the part of the body
                JOptionPane.showMessageDialog(null,"incorrect");
                partsDrawn++;
                artist.drawParts(partsDrawn);
            }
        }
        if(partsDrawn==5)
        {
            JOptionPane.showMessageDialog(null, "failed to guess, the word is: "+wordToGuess);
        }
        else
        {
            JOptionPane.showMessageDialog(null, "correct, the word was: "+ wordToGuess);
        }
    }

    private boolean checkLetter(String theGuess)
    {
        boolean matches=false;
        for(int i=0;i<wordToGuess.length();i++)
        {
            if(theGuess.equals(wordToGuess.substring(i,i+1)))
            {
                correctLetters[i]=theGuess;
                matches=true;
                numCorrect++;
            }
        }
        return matches;
    }

}

ご協力ありがとうございました

4

7 に答える 7

3

Java docsによると、String#substring はIndexOutOfBoundsException

beginIndex が負の場合、endIndex がこの String オブジェクトの長さより大きい場合、または beginIndex が endIndex より大きい場合。

ループの最後の反復では、文字列の長さiと等しくなりlength、文字列i+1の長さよりも大きいため、例外になります。

したがって、次のように変更する必要があります。

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

for(int i=0;i<wordToGuess.length();i++)
            ^^^
于 2013-10-29T17:18:19.490 に答える
1

あなたのループはfor(int i=0;i<=wordToGuess.length();i++)

簡単な例を考えてみましょう。wordToGuess="ABC"

ループは、i=0 から i<=3 までの値を生成します。

i=0 の場合は最初の文字を選択し、i=1 の場合は 2 番目の文字を選択し、i=2 の場合は 3 番目の文字を選択します。i=3 は意味がありません。

したがって、for(int i=0;i<wordToGuess.length();i++)

于 2013-10-29T17:19:05.663 に答える
0

コア Java は、何が問題なのかを教えてくれます。if(theGuess.equals(wordToGuess.substring(i,i+1)))IndexOutOfBoundsException をスローしていると述べましたか? これは、wordToGuess長さが 1 文字未満 (つまり、空の文字列) であることを意味します。基本的に、長さ 1 [i,i+1) の部分文字列を取得しようとしています。

あなたは学生であり、これらを自分で処理することが重要だと思うので、ヒントを与えます。for ループの条件を見てください。また、デバッガーを使用してコードをステップ実行するか、少なくとも System.out.println(wordToGuess) ステートメントをいくつか入れて、値が何であるかを確認します。

于 2013-10-29T17:22:22.083 に答える
0

問題は、前のforループで範囲外になっていることです: for(int i=0;i<=wordToGuess.length();i++)。これは、文字列で使用可能な文字の末尾を超えてループします。エンドポイント表記を使用する部分文字列関数を使用していることに注意してください。後者のエンドポイントは文字列の境界内にある必要があるため、このループは として指定する必要がありますfor(int i=0;i<wordToGuess.length();i++)。これにより、最後の反復でIndexOutOfBoundsError.

于 2013-10-29T17:17:45.663 に答える
0

forループ内の条件を , から に変更します。i<=wordToGuess.length()これは、ループが最後の要素になるi<wordToGuess.length()瞬間になるため、自然に「範囲外」を指すためです。ii+1

于 2013-10-29T17:18:32.923 に答える
0

あなたは明らかに範囲外だからです。文字列の末尾からサブストリングを作成することはできません。

for(int i=0;i<wordToGuess.length();i++)
{
    if(theGuess.equals(wordToGuess.substring(i,i+1)))
    {
        correctLetters[i]=theGuess;
        matches=true;
        numCorrect++;
    }
}

見つけるための最も速い方法は、アプリをデバッグすることです

于 2013-10-29T17:18:38.557 に答える
0

以下の変更を行います

for(int i=0;i<wordToGuess.length();i++)
于 2013-10-29T17:18:55.343 に答える