如何解决字符串索引超出空格键字符的范围
例如,唐纳德·特朗普(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.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] ==>特朗普
您的项目难道不是那么容易吗?
,您的错误应该在 String lastnamec = lastnamess.substring(breakbetween + 1,breakbetween + 1 );
行中,因为姓氏是fullname.substring(length - 3,length);
的长度为3的字符串,并且对于“唐纳德·特朗普”而言,分界点大于3,其中空格为字符6。
您应该稍微简化一下代码,使其更易于阅读和查找问题。
,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
。
只需要这些行。
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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。