Search code examples
javajoptionpaneturtle-graphics

why my string index is out of range?


I am making a hangman game for my ap computer science class and could not seem to figure out how to fix my problem with the strings. I am getting an out of bounds index error. it says

java.lang.StringIndexOutOfBoundsException: String index out of range: 7

occurring here:

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

Here is the program code if it is any help.

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

}

Thank you for any help you provide


Solution

  • Because you are out of range obviously. you cannot substring from end of string.

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

    Fastest way to find out is to debug the app