Java 数组问题超出范围
我尝试了这么多版本的代码,但似乎都不正确。 如果我尝试只包含两部分的内容,则第二个if语句会出现数组越界问题。但是,如果名称中有3个部分,则效果很好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
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];
您正在为fullNamefullName=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。。哦,是的。西蒙。我认为这两个函数是相同的:)