#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);