space 条字符的字符串索引超出范围
String index out of range on space bar character
例如,名称 Donald trump(12 个字符)会导致错误字符串索引超出范围 7(找到 space 的位置),即使名称 Donald trump 更长。
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.substring(String.java:1963)
在 test.Usernamesubstring.main(Usernamesubstring.java:14)
你让它变得比需要的更复杂。一个简单的解决方案可以使用 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);
}
}
有时独立于您的索引
String fullName = "Donald Trump";
String[] result = fullName.split (" ");
你现在会发现结果
结果 [0] ==> 唐纳德
结果[1] ==>特朗普
这对您的项目来说是不是更容易一些?
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()
函数删除开头和结尾的白色 space,并在出现白色 space 时拆分字符串。由于人们可以有一些中间名和其他东西,我只是从原始输入字符串中替换姓氏,再次调用 trim()
然后你就提取了所有内容。
如果您确实需要子字符串方法,以下方法可行:
String lastname = name.substring(name.lastIndexOf(" ")).trim();
String firstname = name.substring(0,name.lastIndexOf(" ")).trim();
您通常不存储索引变量。但是每个变体都需要某种错误检查,您可以使用 try{}
和 catch()
或在解析之前检查 String
。
您的错误应该在 String lastnamec = lastnamess.substring(breakbetween + 1, breakbetween + 1 );
行中,因为 lastnamess 是来自 fullname.substring(length - 3, length);
的长度为 3 的字符串,对于“Donald Trump”,breakbetween 大于 3,其中 space 是字符 6.
你应该稍微简化你的代码,这样更容易阅读和发现问题。
只需要这些行。
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);
例如,名称 Donald trump(12 个字符)会导致错误字符串索引超出范围 7(找到 space 的位置),即使名称 Donald trump 更长。
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.substring(String.java:1963) 在 test.Usernamesubstring.main(Usernamesubstring.java:14)
你让它变得比需要的更复杂。一个简单的解决方案可以使用 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);
}
}
有时独立于您的索引
String fullName = "Donald Trump";
String[] result = fullName.split (" ");
你现在会发现结果 结果 [0] ==> 唐纳德 结果[1] ==>特朗普
这对您的项目来说是不是更容易一些?
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()
函数删除开头和结尾的白色 space,并在出现白色 space 时拆分字符串。由于人们可以有一些中间名和其他东西,我只是从原始输入字符串中替换姓氏,再次调用 trim()
然后你就提取了所有内容。
如果您确实需要子字符串方法,以下方法可行:
String lastname = name.substring(name.lastIndexOf(" ")).trim();
String firstname = name.substring(0,name.lastIndexOf(" ")).trim();
您通常不存储索引变量。但是每个变体都需要某种错误检查,您可以使用 try{}
和 catch()
或在解析之前检查 String
。
您的错误应该在 String lastnamec = lastnamess.substring(breakbetween + 1, breakbetween + 1 );
行中,因为 lastnamess 是来自 fullname.substring(length - 3, length);
的长度为 3 的字符串,对于“Donald Trump”,breakbetween 大于 3,其中 space 是字符 6.
你应该稍微简化你的代码,这样更容易阅读和发现问题。
只需要这些行。
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);