我正在编写一个刽子手(游戏)程序,我有一个编码短语,显示为用户的星号。当用户猜出一个正确的字母时,我正在尝试更改编码的星号短语,以便将一个星号更改为用户输入字母。我正在使用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));
答案 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())