java - 代码崩溃了,它意味着采用全名,例如 John Cena 并将其输出为 JCena)
问题描述
private void getName()
{
System.out.println("Please enter your full name");
String fullName = iscan.next();
getUserName(fullName);
}
private void getUserName(String fullName)
{
String firstChar = fullName.substring(0, 1);
int firstSpace = fullName.indexOf(" ");
int lastSpace = fullName.lastIndexOf(" ");
String lastName = fullName.substring(firstSpace, lastSpace);
String userName = firstChar+lastName;
System.out.println("Your username is: " +userName);
}
每当我尝试输入名称时,代码都会崩溃。出现的错误是 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 提前谢谢!
解决方案
首先,如果这些方法不属于对象类,我会将它们设为静态。
目前您的代码正在崩溃,因为您的扫描仪仅在“John”中读取,并且如果您要查找的字符不在字符串中,则 indexOf() 返回 -1。因此,您尝试从索引 -1 到 -1 的子字符串超出数组范围,因此出现超出范围的错误。
scan.next() 在空格处终止,您将需要使用 scan.nextLine() 它将读取整个字符串,直到它到达行尾。
字符串中只有一个空格,因此第一个和最后一个空格将位于同一索引处。
使用以下代码:
String lastName = fullName.substring(firstSpace + 1, fullName.length());
现在您不再需要第二个空格的代码。您还可以使用 split(" ") 在空格处将字符串分成两半(这将是我解决此问题的首选方法,或正则表达式,但这似乎有点过分了)。
自己解决这个问题的一种简单方法是通过放置打印语句来确保您从方法调用或使用调试器中获得所需的内容。
学习调试器也将是无价的,因为如果您可以看到程序的每个步骤发生的底层过程,这个问题就不难解决。
推荐阅读
- php - 最后删除 .html 并 301 重定向到子域上的新链接
- javascript - 当我们获取时触发了哪个事件
- opengl - OpenGL程序中的计时?
- java - java.net.ConnectException:连接被拒绝:连接到 Ldap 时
- wordpress - 页面标题使用什么 HTML 类?
- supercollider - OSC msg 的开关结构控制
- python - 是否可以使用 HostGator 共享 Linux 虚拟主机部署 Django 网站?
- python - 如何轻松找到已超时的协程?
- sql-server - 与相同 2 个表 Northwind 数据库的子查询相比,具有 2 个表的内部联接查询给出不同的结果
- angular - 如何将 2 个离子卡放在同一行仅用于 Web 视图?