我该怎么做才能修复java.lang.StringIndexOutOfBoundsException?

时间:2015-10-16 16:44:19

标签: java indexoutofboundsexception

我正在编写一个刽子手(游戏)程序,我有一个编码短语,显示为用户的星号。当用户猜出一个正确的字母时,我正在尝试更改编码的星号短语,以便将一个星号更改为用户输入字母。我正在使用indexOf方法,但它一直输出-1并给我

java.lang.StringIndexOutOfBoundsException
String index out of range -1

以下是代码:

 System.out.print("Enter your next guess: ");
 String userGuess = keyboard.nextLine();

 System.out.println("You guessed " + userGuess.toUpperCase() + ".");
 System.out.println();
 if(phrase.contains(userGuess.toUpperCase())) {

   System.out.println("This is present in the secret phrase.");
   System.out.println();
   System.out.println("Number of wrong guesses so far: " + wrongGuesses);
   int index = phrase.indexOf(userGuess);
   System.out.print(index);
   encodedPhrase = (encodedPhrase.substring(0, index) + userGuess + encodedPhrase.substring(index + 1));

5 个答案:

答案 0 :(得分:3)

仅仅因为字符串包含userGuess.toUpperCase()并不意味着它包含userGuess。当它没有时,你会得到-1。

一个简单的解决方法:

String userGuess = keyboard.nextLine().toUpperCase();

然后你可以删除所有其他.toUpperCase()个调用,因为字符串已经是大写的,一劳永逸。

答案 1 :(得分:1)

根据您的陈述,

userGuess可能不属于您的短语:

int index = phrase.indexOf(userGuess);
如果userGuess不属于phrase

this page将返回-1。所以在使用substring之前,请尝试使用:

if (index < 0) {
   //userGuess not part of phrase
} else {
    //do get substring and other business logic
}

此外,您尝试使用userGuess.toUpperCase()进行包含,其他方法可以避免它:

int index = phrase.indexOf(userGuess.toUpperCase());

答案 2 :(得分:1)

如果我理解你的短语是在首都。

检查userguess if(phrase.contains(userGuess.toUpperCase()))时,您将其转换为大写,但在检查索引int index = phrase.indexOf(userGuess);时,您不是。

尝试在将userGuess转换为大写之后获取索引,就像在if条件中一样。

答案 3 :(得分:0)

您确认用户猜测的大写版本在您的字符串中,但稍后您的indexOf()检查检查大写版本。将用户的猜测转换为大写,然后检查它是否在字符串中以及它的索引是什么。

答案 4 :(得分:0)

您必须将输入字符和单词转换为大写或小写。

而不是:

phrase.contains(userGuess.toUpperCase())

写道:

phrase.toUpperCase().contains(userGuess.toUpperCase())