Java - заменить символ в строке
Не думаю, что я не искал в Интернете ответа. Почему это дает мне ошибку outofbounds?
У меня есть две строки из 6 символов. Один из них - "Даниил", а другой - "------". Пользователь вводит персонажа. Цикл проходит через строку "daniel" и проверяет 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)
3 ответа
Замещать
guess2.setCharAt(word.charAt(j), guess);
с
guess2.setCharAt(j, guess);
Первый параметр - это индекс символа, который нужно заменить в StringBuilder
, а не сам персонаж.
Кроме того, кажется, что в for
использование цикла i
вместо j
,
for (int j=0;i<word.length();j++) {
String.length() возвращает длину строки, начиная с 1, а не с 0. Поэтому всякий раз, когда вы используете String.length(), всегда используйте символ меньше (<).
Вместо использования String builder
Вы можете просто заменить все, используя метод regex + replaceAll
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----