StringIndexOutOfBoundsException в цикле подсчета в Java
Я должен написать код для класса с использованием Java, в котором число вхождений буквы E подсчитывается и распечатывается (оба случая включены). Это то, что у меня есть.
String sVerse = "As we enter our centennial year we are still young ";
System.out.println(sVerse);
int len3 = sVerse.length();
int countE = 0;
for (int d = 0; d <= len3; d++){
char e = sVerse.charAt(d);
d = d + 1;
if (e == 'e' || e == 'E')
{
countE = countE + 1;
}
else
{
countE = countE;
}
}
System.out.println(countE);
Код выполняется, и строка печатается, но после печати строки я получаю эту ошибку:
java.lang.StringIndexOutOfBoundsException: String index out of range: 1258
at java.lang.String.charAt(Unknown Source)
at Unit4plus.main(Unit4plus.java:125)
3 ответа
Вы увеличиваете d
внутри цикла, который вы не должны - просто дайте for
кругом делай свое дело. Кроме того, вы должны завершить цикл с <
не <=
:
int countE = 0;
for (int d = 0; d < len3; d++) {
char e=sVerse.charAt(d);
if (e=='e' || e=='E') {
countE++;
}
}
Но, честно говоря, вы можете просто передать символы в строке для более элегантного решения:
long countE = sVerse.chars().filter(c -> c == 'e' || c == 'E').count();
Ваше условие в первом цикле должно быть:
d < len3
Поскольку длина начинается с 1, а индекс символов в вашей строке равен 0.
Более того, ваше утверждение d=d+1 в цикле for бесполезно и заставляет вас повторять 2 на 2, так как вы уже увеличиваете его в цикле for с помощью
d++
Вам необходимо изменить условие для цикла, поскольку длина равна +1 от максимального индекса. Вы также увеличиваете значение переменной "d" в два раза, один в определении цикла "for", а другой - внутри. Это. Попробуйте заменить его следующим кодом:
String sVerse = "As we enter our centennial year we are still young";
int len3 = sVerse.length();
int countE = 0;
for (int d = 0; d < len3; d++) {
char e = sVerse.charAt(d);
if (e == 'e' || e == 'E')
countE++;
}
System.out.println(countE);