Индекс строки выходит за пределы диапазона при вводе символа пробела

#java #string #substring #lastindexof #string-function

#java #строка #подстрока #lastindexof #строка-функция

Вопрос:

Например, имя Дональд Трамп (12 символов) выдает ошибку индекс строки вне диапазона 7 (где найден пробел), даже если имя Дональд Трамп длиннее.

 package test;

import javax.swing.JOptionPane;

public class Usernamesubstring {

    public static void main(String[] args) {
        String fullname = JOptionPane.showInputDialog("What is your full name");
        int breakbetween = fullname.lastIndexOf(" ");
        String firstnamess = fullname.substring(breakbetween - 3, breakbetween);
        int length = fullname.length();
        String lastnamess = fullname.substring(length - 3, length);
        String firstnamec = firstnamess.substring(0, 0);
        String lastnamec = lastnamess.substring(breakbetween   1, breakbetween   1 );
        firstnamec = firstnamec.toUpperCase();
        lastnamec = lastnamec.toUpperCase();
        String firstname = firstnamess.substring(1,3);
        String lastname = firstnamess.substring(1,3);
        firstname = firstnamec   firstname;
        lastname = lastnamec   lastname;
        System.out.println(firstname   lastname);
}
}
  

Исключение в потоке «main» java.lang.Исключение StringIndexOutOfBoundsException: строковый индекс вне диапазона: 7
на java.lang.Строка.подстрока(String.java:1963)
при тестировании.Usernamesubstring.main(Usernamesubstring.java:14)

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

1. Что, например, вызывает исключение?

2. можете ли вы объяснить, что вы имеете в виду, но я думаю, что ошибка возникает из .lastIndex из строки 2

3. Кстати. пожалуйста, придумайте несколько разумных имен переменных. Я не вижу разницы между firstnamess , firstnamec и firstname — это делает невозможным понимание того, что должен делать код.

4. Когда вы получаете сообщение об ошибке, оно сообщает вам, в какой строке кода это произошло. Просто прочитайте ошибку целиком. Или, по крайней мере, скопируйте / вставьте его в вопрос.

5. Исключение в потоке «main» java.lang. Исключение StringIndexOutOfBoundsException: строковый индекс вне диапазона: 7 на java.lang. Строка.подстрока (String.java:1963) в процессе тестирования. Usernamesubstring.main(Usernamesubstring.java:14)

Ответ №1:

Вы сделали это более сложным, чем это должно быть. Простое решение может быть сделано с использованием String.split (который разделяет строку на массив строк меньшего размера на основе разделителя, например, "Donald Trump".split(" ") == {"Donald", "Trump"} )
полного кода

 
class Usernamesubstring // change that since it no longer uses substrings
{
    public static void main (String[] args)
    {
        String fullName = "Donald Trump";
        String[] parts = fullName.split(" ");
        String firstName = parts[0];               // first item before the space
        String lastName = parts[parts.length - 1]; // last item in the array
        
        System.out.println(firstName   " "   lastName);
    }
}
  

Ответ №2:

иногда независимо от ваших индексов

 String fullName = "Donald Trump";
String[] result = fullName.split (" ");
  

в результате вы теперь найдете
результат [0] ==> Дональд
результат [1] ==> Козырь

разве это не немного проще для вашего проекта?

Ответ №3:

Ваша ошибка должна быть в строке, String lastnamec = lastnamess.substring(breakbetween 1, breakbetween 1 ); поскольку lastnamess — это строка длиной 3 от fullname.substring(length - 3, length); , а интервал между «Donald Trump» больше 3, где пробел — это символ 6.

Вам следует немного упростить свой код, это облегчает чтение и поиск проблем.

Ответ №4:

tl; dr: Исключение возникает, когда вы пытаетесь получить доступ к строке с индексом, который превышает ее длину или просто не содержится в строке (отрицательные значения).

Что касается вашего подхода: обычно не рекомендуется запрашивать полное имя, потому что люди склонны вводить странные данные или перепутывать порядок. Лучше запрашивать имя и фамилию отдельно.

Предполагая, что кто-то вводит свое имя с помощью Firstname Lastname , вам не пришлось бы создавать такую путаницу в подстроках, Java обладает некоторыми приятными функциями:

     String name = "Mario Peach Bowser";
    name = name.trim();
    String[] parts = name.split(" ");
    String lastname = parts[parts.length-1];
    String firstname = name.replace(lastname, "").trim();
    System.out.println("Hello " firstname ", your last name is: " lastname);
  

В этом случае я использую trim() функцию для удаления пробелов в начале и конце и просто разделяю строку при появлении пробела. Поскольку у людей могут быть некоторые средние имена и прочее, я просто заменяю фамилию из необработанной входной строки, вызываю trim() ее снова, и вы все извлекаете.

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

     String lastname = name.substring(name.lastIndexOf(" ")).trim();
    String firstname = name.substring(0,name.lastIndexOf(" ")).trim();
  

Обычно вы не сохраняете переменные индекса. Но для каждого варианта потребуется какая-то проверка на ошибки, вы можете либо использовать try{} и catch() , либо проверить String перед синтаксическим анализом.

Ответ №5:

Требуются только эти строки.

 String[] nameArr = fullname.split(" ");
String lastN = nameArr[nameArr.length - 1];
int lastIndexOf = fullname.lastIndexOf(lastN);
String firstN = fullname.substring(0, lastIndexOf);
System.out.println(firstN   " "   lastN);