首页 > 解决方案 > 代码崩溃了,它意味着采用全名,例如 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 提前谢谢!

标签: java

解决方案


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

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

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

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

使用以下代码:

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

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

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

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


推荐阅读