java - 代码正在崩溃,它应该采用全名,例如John Cena 并将其输出为 JCena)

标签 java

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

   }

每当我尝试输入名称时,代码就会崩溃。 出现的错误是 线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1 提前致谢!

最佳答案

首先,如果这些方法不属于对象类,我会将它们设为静态。

目前,您的代码正在崩溃,因为您的扫描仪仅读取“John”,并且如果您要查找的字符不在字符串中,则 indexOf() 返回 -1。因此,您尝试获取索引 -1 到 -1 之间的子字符串,该子字符串超出了数组范围,因此出现了越界错误。

scan.next() 在空格处终止,您将需要使用 scan.nextLine() 它将读取整个字符串,直到到达行尾。

字符串中只有一个空格,因此第一个和最后一个空格将位于相同的索引处。

使用以下代码:

String lastName = fullName.substring(firstSpace + 1, fullName.length());

现在您不再需要第二个空间的代码。 您还可以使用 split("") 在空格处将字符串分成两半(这将是我解决此问题的首选方法,或使用正则表达式,但这似乎太过分了)。

您自己解决这个问题的一个简单方法是通过放置 print 语句来确保您从方法调用或使用调试器中获得所需的内容。

学习调试器也是无价的,因为如果您可以看到程序每一步发生的底层过程,那么这个问题并不难解决。

关于java - 代码正在崩溃,它应该采用全名,例如John Cena 并将其输出为 JCena),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59256183/

相关文章:

java - Scoped Variables 和 WeakReferences 奇怪地交互 - 有些对象没有得到垃圾收集

java - 显示 'AfterSignInMessagePage'的正确方法

java - java安装根目录

java - 使用ResponseStatusException类进行错误处理

java - 使用 BouncyCaSTLe API 生成 CSR

java - 检查对象是否被引用,以防止在不修改数据库的情况下软删除

java - Spring 上下文文件组织和最佳实践

java - 如何在并发环境中注意网络请求?

java - 泛型通配符无法转换为泛型类型

java - Android:ImageView只应在一种条件下显示图像,但始终显示它