我正在为我的计算机科学课做一个刽子手游戏,似乎无法弄清楚如何解决我的问题。我得到一个越界索引错误。它说
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;
}
}
感谢您提供的任何帮助
答案 0 :(得分: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++)
^^^
答案 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)语句以查看值是什么。