Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组问题超出范围_Java_Arrays_Indexoutofboundsexception - Fatal编程技术网

Java 数组问题超出范围

Java 数组问题超出范围,java,arrays,indexoutofboundsexception,Java,Arrays,Indexoutofboundsexception,我尝试了这么多版本的代码,但似乎都不正确。 如果我尝试只包含两部分的内容,则第二个if语句会出现数组越界问题。但是,如果名称中有3个部分,则效果很好 import java.util.Scanner; public class testArray { public static void main(String[]args) { Scanner input = new Scanner(System.in); String fullName = in

我尝试了这么多版本的代码,但似乎都不正确。 如果我尝试只包含两部分的内容,则第二个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");
        }
    }
}

错误来自这里:

    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个单词,则会出现
数组索引OutofBoundsException
。您必须添加以下内容:

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

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

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

String firstName = parts[0];
String middleName = parts[1];
String lastName = parts[2];
在这里,如果零件只有索引0和1(长度为2),您将得到一个异常,因为没有
零件[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将为null(或者您可以将其更改为空字符串或任何您想要的内容)

我认为在调用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()));
                    }
                }

我可能建议在空白处拆分,而不是“” 比如说
String[]parts=fullName.split(\\s+)

还有,为什么要添加空格(
fullName=fullName++;


此外,您可能无法进行部件比较,因为您将首先从数组中提取字符串,在拆分后直接进行if检查(
if(parts.length==3)
)(
String[]parts=fullName.split(\\s+);

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

请尝试以下方法:

        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");
                }
            }
        }
问题就在这里

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

您正在为fullName
fullName=fullName++添加两个空格但实际上这些空格不会追加,因为全名后面没有文本,因此
部分
在0位置只包含一个元素。您正在调用parts数组的第一个位置,该位置不可用
String middleName=parts[1]
因此您看到的是
ArrayIndexOutOfBoundsException

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

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

此处,“parts[0].length()”应替换为“parts[0].length()-1”,因为上一个将大小增加1,因此数组超出了范围

下一行将出现相同的错误。 因此,将每个.length替换为.length-1

然后拆下这条线


全名=全名+++;因为它将变量路径的长度增加到5,因此它会进入if语句

异常的完整堆栈跟踪是什么?这应该会给你一些非常重要的线索…我对java是新手。在原文中发布了错误。嗯,似乎
部分[2]
不存在……这意味着你的名字为空,这就是你无法提取子字符串的原因。它是空的,因为您的拆分失败,而您的拆分失败的原因我不知道,因为您没有向我们提供控制台输入为什么要附加两个空格
fullName=fullName++?现在我在initialOutput.testArray.main(testArray.java:16)@RyanSchachte处的线程“main”java.lang.NullPointerException中遇到异常,例如,当用户没有中间名,只输入“Ryan Schachte”时会发生什么?我认为你应该用if语句来处理这个问题。对于这个特殊的异常,将middleName初始化为
可能会起作用,但从长远来看,您需要一个策略来处理这个问题。@RyanSchachte我用添加的代码测试了您的代码,效果很好。请查看我的更新,了解要添加哪些内容来修复它。这正是我要查找的内容。非常感谢!我确实用c#执行了你的程序。我编辑后它运行良好。。Console.WriteLine(lastName.ToUpper()+”,“+firstNameInitial+firstName.Substring(1,parts[0].Length-1)+“+lastNameInitial+”;Console.WriteLine(lastNameInitial+lastName.Substring(1,部分[2]。长度-1)+“,”+firstNameInitial+firstName.Substring(1,部分[2]。长度-1)+“+middleNameInitial+middleName.Substring(1,部分[1]。长度-1));欢迎使用SO,@subranshum并感谢您的回答。实际上,在Java中,String.substring的第二个参数是结束索引(已排除),因此没有任何错误。见:@SimonAndréForsberg。。哦,是的。西蒙。我认为这两个函数是相同的:)