不要以为我没有在网上搜索答案。为什么它会给我一些outofbounds错误?
我有两个6个字符长的字符串。一个是“daniel”,另一个是“------”。用户输入一个角色。循环遍历“daniel”字符串并通过char检查char是否与用户输入匹配。如果匹配,则应将猜测的char替换为“------”中的char。因此,如果您输入'a',它应输出“-a ----”并继续循环。接下来,如果输入“e”,它应输出“-a - e-”等。代码不会出现编译错误或任何警告,也非常有意义。我尝试了子串和替换,但这更简单,更短。我试过调试它,但它没有提供有用的信息。我不知道为什么它会返回outofbounds错误。
package hello.world;
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String word="daniel";
StringBuilder guess2 = new StringBuilder("------");
char guess;
System.out.println("**********************");
System.out.println("* Welcome to Hangman *");
System.out.println("**********************");
for (int i=0;i<10;i++) {
System.out.print("Enter a letter: ");
guess=in.nextLine().charAt(0);
for (int j=0;i<word.length();j++) {
if (guess==word.charAt(j)) {
guess2.setCharAt(word.charAt(j), guess);
System.out.print(guess2);
}
}
}
}
}
输出:
**********************
* Welcome to Hangman *
**********************
Enter a letter: a
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 97
at java.lang.AbstractStringBuilder.setCharAt(AbstractStringBuilder.java:380)
at java.lang.StringBuilder.setCharAt(StringBuilder.java:76)
at hello.world.HelloWorld.main(HelloWorld.java:22)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
答案 0 :(得分:1)
替换
guess2.setCharAt(word.charAt(j), guess);
与
guess2.setCharAt(j, guess);
第一个参数是要在StringBuilder
中替换的字符的索引,而不是字符本身。
此外,使用for
代替i
的{{1}}循环似乎存在拼写错误。
j
答案 1 :(得分:0)
String.length()返回从1开始而不是从0开始的字符串长度。因此,每当使用String.length()时,总是使用小于(&lt;)符号。
答案 2 :(得分:0)
您可以使用regex + replaceAll方法替换所有内容,而不是使用String builder
for (int i=0;i<10;i++) {
System.out.print("Enter a letter: ");
guess=in.nextLine().charAt(0);
word = word.replaceAll("[^"+ guess +"]", "-");
System.out.println(word);
}
<强>结果:强>
Enter a letter: a
-a----