-1

我已经尝试了很多此代码的变体,但我似乎无法让它正确。如果我只尝试两部分,我会得到第二个 if 语句的数组越界问题。但是,如果名称中有 3 个部分,它就可以正常工作。

import java.util.Scanner;

public class testArray 
{
   public static void main(String[]args)
   {
        Scanner input = new Scanner(System.in);
        String fullName = input.nextLine();
        fullName = fullName + " " + " ";
        System.out.println(fullName);
        String [] parts = fullName.split(" ");
        String firstName = parts[0];
        String middleName = parts[1];
        String lastName = parts[2];
        String firstNameInitial = firstName.substring(0,1).toUpperCase();         //capitalizes first initial
        String middleNameInitial = middleName.substring(0,1).toUpperCase();       //capitalizes second initial
        String lastNameInitial = lastName.substring(0,1).toUpperCase();           //capitalizes third initial
        String initials = firstNameInitial + middleNameInitial + lastNameInitial; //Combines initials of name in capital form

        if (parts.length == 3)
        {
            System.out.println(initials);
            System.out.println(lastName.toUpperCase() + ", " + firstNameInitial+firstName.substring(1,parts[0].length()) + " " + lastNameInitial + ".");
            System.out.println(lastNameInitial + lastName.substring(1,parts[2].length()) + ", " + firstNameInitial+firstName.substring(1,parts[0].length()) + " " + middleNameInitial + middleName.substring(1,parts[1].length()));
        }

        if (parts.length == 2)
        {
            System.out.println("error");
        }
    }
}
4

7 回答 7

1

那是因为您初始化变量的方式:

String firstName = parts[0];
String middleName = parts[1];
String lastName = parts[2];

在这里,如果部分只有索引 0 和 1(长度为 2),您将得到一个异常,因为没有parts[2](它的索引超出范围)。

将其修改为如下内容:

String firstName = parts[0];
String middleName = null;
String lastName = parts[1];
if (parts.length > 2) {
    middleName = parts[1];
    lastName = parts[2];
}

使用此代码,只有当部件的长度大于 2 时才会设置 middleName,这意味着索引 2 将存在。否则, middleName 将为空(或者您可以将其更改为空字符串或任何您想要的)

于 2013-09-19T19:49:03.133 回答
1

在检查数组的长度之前,您正在尝试访问数组中的第三个对象。

试试这个:

        import java.util.Scanner;

        public class testArray 
        {
            public static void main(String[]args)
            {
                Scanner input = new Scanner(System.in);
                String fullName = input.nextLine();
                fullName = fullName + " " + " ";
                System.out.println(fullName);
                String [] parts = fullName.split(" ");

                if(parts.length == 3)
                {
                    String firstName = parts[0];
                    String middleName = parts[1];
                    String lastName = parts[2];
                    String firstNameInitial = firstName.substring(0,1).toUpperCase();         //capitalizes first initial
                    String middleNameInitial = middleName.substring(0,1).toUpperCase();       //capitalizes second initial
                    String lastNameInitial = lastName.substring(0,1).toUpperCase();           //capitalizes third initial
                    String initials = firstNameInitial + middleNameInitial + lastNameInitial; //Combines initials of name in capital form
                    System.out.println(initials);
                    System.out.println(lastName.toUpperCase() + ", " + firstNameInitial+firstName.substring(1,parts[0].length()) + " " + lastNameInitial + ".");
                    System.out.println(lastNameInitial + lastName.substring(1,parts[2].length()) + ", " + firstNameInitial+firstName.substring(1,parts[0].length()) + " " + middleNameInitial + middleName.substring(1,parts[1].length()));
                }else{
                    System.out.println("error");
                }
            }
        }
于 2013-09-19T19:54:42.243 回答
0

错误来自这里:

    Scanner input = new Scanner(System.in);
    String fullName = input.nextLine();
    fullName = fullName + " " + " ";
    System.out.println(fullName);
    String [] parts = fullName.split(" ");
    String firstName = parts[0];
    String middleName = parts[1];
    String lastName = parts[2];

如果有人输入的文本长度少于 3 个单词,您会得到一个ArrayIndexOutOfBoundsException. 您必须添加以下内容:

    Scanner input = new Scanner(System.in);
    String [] parts = null;
    while (input.hasNext()) {
        System.out.println("Please enter first middle and last name");
        String fullName = input.nextLine();
        fullName = fullName + " " + " ";
        System.out.println(fullName);
        parts = fullName.split(" ");
        if (parts.length == 3)
            break;
    }
    String firstName = parts[0];
    String middleName = parts[1];
    String lastName = parts[2];

这将提示用户输入三个单词,直到您获得正确的数量。

于 2013-09-19T19:48:54.860 回答
0

我认为您想在调用 split 之后添加这些行:

String [] parts = fullName.split(" ");
if (parts.length == 2)
                    {
                        System.out.println("error");
                        return;
                    }

所以代码看起来像:

public static void main(String[]args) {
                    Scanner input = new Scanner(System.in);
                    String fullName = input.nextLine();
                    fullName = fullName + " " + " ";
                    System.out.println(fullName);
                    String [] parts = fullName.split(" ");
                    if (parts.length == 2)
                    {
                        System.out.println("error");
                    } else if(parts.length == 3) {
                    String firstName = parts[0];
                    String middleName = parts[1];
                    String lastName = parts[2];
                    String firstNameInitial = firstName.substring(0,1).toUpperCase();         //capitalizes first initial
                    String middleNameInitial = middleName.substring(0,1).toUpperCase();       //capitalizes second initial
                    String lastNameInitial = lastName.substring(0,1).toUpperCase();           //capitalizes third initial
                    String initials = firstNameInitial + middleNameInitial + lastNameInitial; //Combines initials of name in capital form


                    System.out.println(initials);
                    System.out.println(lastName.toUpperCase() + ", " + firstNameInitial+firstName.substring(1,parts[0].length()) + " " + lastNameInitial + ".");
                    System.out.println(lastNameInitial + lastName.substring(1,parts[2].length()) + ", " + firstNameInitial+firstName.substring(1,parts[0].length()) + " " + middleNameInitial + middleName.substring(1,parts[1].length()));
                    }
                }
于 2013-09-19T19:49:23.003 回答
0

我可能会建议分割空白而不是“”,例如 String [] parts = fullName.split("\\s+");

还有你为什么要加空格(fullName = fullName + " " + " ";

您也可能无法进行零件比较,因为您将首先从数组中提取字符串,然后将您的 if check ( if(parts.length == 3)) 放在拆分 ( String [] parts = fullName.split("\\s+");) 之后

于 2013-09-19T19:49:49.593 回答
0

问题在这里

String middleName = parts[1];
String lastName = parts[2];

您为 fullName 添加了两个空格,fullName = fullName + " " + " ";但实际上这些空格不会附加,因为 fullName 之后没有文本,因此parts在 0 位置仅包含一个元素。你正在调用不可用的部件数组的第一个位置String middleName = parts[1];所以你看到了ArrayIndexOutOfBoundsException

于 2013-09-19T19:58:10.347 回答
0

0,1,2,3,4 >> 这些索引直到 4 但总组件或长度为 5 。

所以在 firstName.substring(1,parts[0].length())

在这里,“parts[0].length()”应该被替换为“parts[0].length()-1”,因为前一个将大小增加 1,因此数组超出范围。

您将在下一行中遇到相同的错误。因此,将每个 .length 替换为 .length-1 ..

并删除此行

全名=全名+“”+“”;因为它将变量路径的长度增加到 5,因此它不会出现在 if 语句中

于 2013-09-19T20:24:53.977 回答