Я не могу найти причину «java.lang.Ошибка StringIndexOutOfBoundsException»

#java #string #for-loop

#java #строка #для цикла

Вопрос:

Мой код принимает первое и последнее слова пользовательского ввода и преобразует их в верхний регистр. Однако, когда пользователь вводит «» или «java» (слово без пробелов), появляется ошибка. Я не смог найти причину ошибки.

     Scanner input = new Scanner(System.in);
    String s = input.nextLine();

    String first = "";
    String last = "";

    String end = s;
    int count = 0;

    for (int i = 0;i<s.length()-1;i  ) {

        if (s.charAt(i) == ' ') {

            count  ;

        }
        if (count == 0) {

            end = s.toUpperCase();
        }

        else if (count > 0) 

        first = s.substring(0,s.indexOf(' '));
        last = s.substring(s.lastIndexOf(' ') 1);

        end = (first.toUpperCase()   " "   s.substring(first.length() 1,s.indexOf(last))   " "  last.toUpperCase());

    }


    System.out.println(count);
  

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

1. Я бы напечатал длину s и длину first в вашем предложении else. Я думаю, это, вероятно, скажет вам.

2. Разделите слова с помощью String.split (» «) и сохраните в начальной и конечной строке в соответствии с требованием и преобразуйте ее в верхний регистр.

Ответ №1:

 String first = s.substring(0,s.indexOf(' '));
String last = s.substring(s.lastIndexOf(' ') 1);
  

Ваш код здесь вызывает проблему. Если пробел отсутствует в вашем String , то indexOf(' ') вернет -1. Очевидно, что вы не можете использовать подстроку между 0 и -1. Вам нужно проверить, присутствует ли ' ' она в String подстроке, прежде чем вводить ее.

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

1. Я отредактировал его, к сожалению, все еще выдает ошибку. Я уверен, что речь идет о той части, которую вы упомянули, но даже когда я проверяю, она выдает ошибку.

2. Вы делаете то же самое в своей последней строке перед печатью. Похоронен там s.substring(first.length() 1,s.indexOf(last)) .

3. Я должен уточнить, что проблема здесь в том, что s.indexOf(last) возвращается ноль и substring() получает строку от start до end - 1 , так что конечный индекс становится -1 там.