首先,最后和有时中间名检测Java

时间:2013-09-18 22:04:00

标签: java split java.util.scanner

我正在尝试编写代码,以便在用户输入后以不同格式发出用户名。但是,如果用户没有中间名,系统应打印出错误。我有它,所以如果用户输入三个名称,但如果用户输入两个名称则不起作用,它可以正常工作。这是我的代码:

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.");
    }
  }
}

2 个答案:

答案 0 :(得分: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),但两种方法似乎都很好。

答案 1 :(得分:0)

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