为什么我的字符串索引超出范围?

时间:2013-10-29 17:12:53

标签: java joptionpane turtle-graphics

我正在为我的计算机科学课做一个刽子手游戏,似乎无法弄清楚如何解决我的问题。我得到一个越界索引错误。它说

  

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;
    }

}

感谢您提供的任何帮助

7 个答案:

答案 0 :(得分:3)

根据java docs,String#substring抛出IndexOutOfBoundsException

  

如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex。

在循环的最后一次迭代中,i将等于字符串的lengthi+1大于字符串的长度,因此异常。

所以你需要改变:

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

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

答案 1 :(得分: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++)

答案 2 :(得分:0)

问题是您在前面的for循环中超出范围:for(int i=0;i<=wordToGuess.length();i++)。这将循环遍历字符串中可用字符的结尾。注意到您正在使用使用端点表示法的子字符串函数,后一个端点必须在字符串的边界内,因此应将此循环指定为for(int i=0;i<wordToGuess.length();i++)。这将确保最后一次迭代不会调用IndexOutOfBoundsError

答案 3 :(得分:0)

for循环中的条件从i<=wordToGuess.length()更改为i<wordToGuess.length(),因为现在您的循环到达当i成为最后一个元素时,所以i+1自然地指出“越界”。

答案 4 :(得分:0)

因为你明显超出了范围。你不能从字符串的末尾子串。

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

最快的方法是调试应用

答案 5 :(得分:0)

进行以下更改

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

答案 6 :(得分:0)

核心Java很棒,告诉你出了什么问题。你声明if(theGuess.equals(wordToGuess.substring(i,i+1)))抛出了IndexOutOfBoundsException?这意味着wordToGuess长度小于一个字符(即空字符串)。基本上你正试图获得长度为1 [i,i + 1]的子串。

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