#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. Также должен быть я длина() в первой скобке кода, верно?