-1

我正在尝试编写一个代码,以便在输入用户名后以不同的格式给出用户名。但是,如果用户没有中间名,系统应该打印出有错误。我有它,因此如果用户输入三个名称,它可以完美运行,但如果用户输入两个名称,它就不起作用。这是我的代码:

import java.util.Scanner;

public class Assignment3 
{
  public static void main(String[] args) 
  {
    String fullName;
    Scanner in = new Scanner(System.in);
    System.out.print ("What are your first, middle, and last names? ");
    fullName = in.nextLine();
    System.out.println(fullName);
    if (fullName.contains(" "))
    {
      String[] nameParts = fullName.split(" ");
      String firstInitial = nameParts[0].substring(0,1).toUpperCase();
      String secondInitial = nameParts[1].substring(0,1).toUpperCase();
      String thirdInitial = nameParts[2].substring(0,1).toUpperCase();

      if (nameParts[2].isEmpty())
      {
        System.out.println("No Middle Name Detected");
      }
      else
      {
        System.out.println ("Your initials are: " + firstInitial + secondInitial + thirdInitial);

        String lastVariationOne = nameParts[2].substring(0, nameParts[2].length());
        lastVariationOne = lastVariationOne.toUpperCase();
        String firstVariationOne = nameParts[0].substring(0, nameParts[0].length());
        firstVariationOne = firstVariationOne.substring(0,1).toUpperCase() + firstVariationOne.substring(1, nameParts[0].length());
        System.out.println("Variation One: " + lastVariationOne + ", " + firstVariationOne + " " + secondInitial + ".");

        String lastVariationTwo = nameParts[2].substring(0, nameParts[2].length());
        lastVariationTwo = lastVariationTwo.substring(0,1).toUpperCase() + lastVariationTwo.substring(1, nameParts[2].length());
        System.out.println("Variation Two: " + lastVariationTwo + ", " + firstVariationOne);
      }
    }
    else
    {
      System.out.println("Wrong. Please enter your name properly.");
    }
  }
}
4

2 回答 2

0

而不是这个:

if (nameParts[2].isEmpty())
{
    System.out.println("No Middle Name Detected");
}

就像是

if(nameParts.length != 3)
{
    System.out.println("Invalid entry");
}

可能更可取。

基本上,在只输入两个名称的情况下,split()将返回一个长度为 2 的数组,其元素可通过索引 0 和 1 访问。

但是在您的if情况下,您尝试访问索引 2,这可能超出范围(对于您仅输入两个名称的情况,这将是 OOB)。

要解决此问题,您可以(a)像您一样尝试,但捕获 ArrayIndexOutOfBoundsException 或(b)首先检查 split 是否生成了大小合适的数组,然后从那里开始(这是我在列出的更改中采用的方法)。

我建议(b),但两种方法似乎都很好。

于 2013-09-18T22:15:15.753 回答
0

如果不输入中间名,数组大小是否为 2?所以没有名称部分[2]。只需检查名称部分的大小。@jedwards jedwards 的解决方案就在那里。

于 2013-09-18T22:35:44.207 回答