Java String.charAt() выдает java.lang.Исключение StringIndexOutOfBoundsException

#java #string #error-handling #concatenation

Вопрос:

Следующий код должен дать мне строку, объединенную из всех символов после пробела в предложении:

 public class Main {  public static void main (String[] args) {  System.out.println(generateFromSentence("Hello World!"));   }  public static String generateFromSentence(String sentence) {  String output = String.valueOf(sentence.charAt(0));  for (int i = 0; i lt;= sentence.length(); i  ) {  if (sentence.charAt(i) == ' '){  String following = String.valueOf(sentence.charAt(i 1));  output = output.concat(following);  }  }  return output;  } }  

К сожалению, это бросает:

 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 12  at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)  at java.base/java.lang.String.charAt(String.java:693)  at Main.generateFromSentence(Main.java:9)  at Main.main(Main.java:3)  

Я не понимаю, почему индекс будет находиться вне диапазона, в String output = String.valueOf(sentence.charAt(0)); Я указываю индекс 0 — должен быть первым символом моей строки, верно? Уже спасибо.

Ответ №1:

Ваша проблема не в очереди String.valueOf(sentence.charAt(0)); , а в очереди if (sentence.charAt(i) == ' ') . Причина в вашем состоянии остановки цикла. Вы должны использовать i lt; sentence.length() вместо i lt;= sentence.length() следующего:

 public class Main {  public static void main (String[] args) {  System.out.println(generateFromSentence("Hello World!"));   }   public static String generateFromSentence(String sentence) {  String output = String.valueOf(sentence.charAt(0));  for (int i = 0; i lt;= sentence.length(); i  ) {  if (sentence.charAt(i) == ' '){  String following = String.valueOf(sentence.charAt(i 1));  output = output.concat(following);  }  }  return output;  } }  

Имейте в виду, что индексы начинаются с 0, поэтому вы не можете перебирать список или массив, начиная с 0, вплоть до размера списка или массива и включая его.

Кроме того, имейте в виду, что по той же причине ваш (и мой) код выше потерпит неудачу, если предложение "Hello World! " (обратите внимание на конец предложения). Причина в линии String following = String.valueOf(sentence.charAt(i 1)); . Чтобы обойти эту проблему, вам необходимо добавить условие в заявление if:

 public class Main {  public static void main (String[] args) {  System.out.println(generateFromSentence("Hello World! "));   }   public static String generateFromSentence(String sentence) {  String output = String.valueOf(sentence.charAt(0));  for (int i = 0; i lt; sentence.length(); i  ) {  if (sentence.charAt(i) == ' ' amp;amp; ((i   1) lt; sentence.length())){  String following = String.valueOf(sentence.charAt(i 1));  output = output.concat(following);  }  }  return output;  } }  

Комментарии:

1. Также должен быть я длина() в первой скобке кода, верно?