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 第二个,对于 i=2 第三个,i=3 没有意义。

因此使用for(int i=0;i<wordToGuess.length();i++)

于 2013-10-29T17:19:05.663 回答
0

进行以下更改

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

Core Java 非常擅长告诉你哪里出了问题。您说if(theGuess.equals(wordToGuess.substring(i,i+1)))的是抛出 IndexOutOfBoundsException?这意味着wordToGuess长度小于一个字符(即空字符串)。基本上,您正在尝试获取长度为 1 [i,i+1) 的子字符串。

因为你是学生,我认为自己完成这些工作很重要,所以我只是给你一个提示:看看 for 循环条件。此外,使用调试器单步执行代码,或者至少放入一些 System.out.println(wordToGuess) 语句以查看值是什么。

于 2013-10-29T17:22:22.083 回答
0

将循环中的条件fori<=wordToGuess.length(), 更改为i<wordToGuess.length(),因为现在您的循环到达时刻,wheni成为最后一个元素,因此i+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循环中越界了:for(int i=0;i<=wordToGuess.length();i++). 这将循环超过字符串中可用字符的末尾。请注意,您正在使用使用端点表示法的子字符串函数,后一个端点必须在字符串的范围内,因此此循环应指定为for(int i=0;i<wordToGuess.length();i++). 这将确保最后一次迭代不会调用IndexOutOfBoundsError.

于 2013-10-29T17:17:45.663 回答