作业:“线程”main“java.lang.NullPointerException”中的异常
好的,我有一个家庭作业。我以为我已经准备好了一切,现在我得到了一份工作 HW3.main处主线程java.lang.NullPointerException中出现异常 这条线是:作业:“线程”main“java.lang.NullPointerException”中的异常,java,Java,好的,我有一个家庭作业。我以为我已经准备好了一切,现在我得到了一份工作 HW3.main处主线程java.lang.NullPointerException中出现异常 这条线是: tempMembers[i/4].setFirstName(args[i]); 现在我仍然是编程方面的一个新手,到目前为止,我所做的一切都是在Eclipse中完成的。该程序将在文本编辑器中创建,然后在命令提示符下编译和运行。我不知道我是否只是输入了错误的参数或什么 因此,对于这个错误,我的命令提示符条目是 java
tempMembers[i/4].setFirstName(args[i]);
现在我仍然是编程方面的一个新手,到目前为止,我所做的一切都是在Eclipse中完成的。该程序将在文本编辑器中创建,然后在命令提示符下编译和运行。我不知道我是否只是输入了错误的参数或什么
因此,对于这个错误,我的命令提示符条目是
java HW3 Bill Smith 2009 Football Jane Doe 2000 Tennis David Jones 1995 Baseball
那么,错误是在我的代码中还是在我的输入中?如果我的代码中有错误,你能给我指出正确的方向吗?就像我说的,命令行参数对我来说是全新的,我的类不做这些例子,只讨论概念
public class HW3 {
public static void main(String[] args) throws Exception {
if (args.length % 4 != 0) {
throw new Exception(
"First Name, Last Name, Year Inducted, Sport not entered correctly");
}
HallOfFame hallOfFameList = new HallOfFame();
hallOfFameList.setNumberOfMembers(args.length / 4);
HallOfFameMember[] tempMembers = new HallOfFameMember[args.length / 4];
for (int i = 0; i < args.length; i += 4) {
tempMembers[i/4].setFirstName(args[i]);
tempMembers[i/4].setLastName(args[i+1]);
tempMembers[i/4].setYearInducted(Integer.parseInt(args[i+2]));
tempMembers[i/4].setSport(args[i+3]);
}
hallOfFameList.setMembers(tempMembers);
HallOfFameMember[] sortedMembers = null;
hallOfFameList.sortMembers(sortedMembers);
HallOfFame.printReport(sortedMembers);
}
}
public class HallOfFameMember implements Comparable<HallOfFameMember> {
private String firstName;
private String lastName;
private String sport;
private int yearInducted;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getSport() {
return sport;
}
public void setSport(String sport) {
this.sport = sport;
}
public int getYearInducted() {
return yearInducted;
}
public void setYearInducted(int yearInducted) {
this.yearInducted = yearInducted;
}
@Override
public int compareTo(HallOfFameMember o) {
return this.getYearInducted() - o.getYearInducted();
}
}
public class HallOfFame {
private HallOfFameMember[] members;
private int numberOfMembers;
public HallOfFameMember[] getMembers() {
return members;
}
public void setMembers(HallOfFameMember[] members) {
this.members = members;
}
public int getNumberOfMembers() {
return numberOfMembers;
}
public void setNumberOfMembers(int numberOfMembers) {
this.numberOfMembers = numberOfMembers;
}
public void sortMembers(HallOfFameMember[] sortedMembers) {
boolean bool = true;
HallOfFameMember temp;
while (bool) {
bool = false;
for (int i = 0; i < sortedMembers.length - 1; i++) {
if (sortedMembers[i].compareTo(sortedMembers[i + 1]) > 0) {
temp = sortedMembers[i];
sortedMembers[i] = sortedMembers[i + 1];
sortedMembers[i + 1] = temp;
bool = true;
}
}
}
}
public static void printReport(HallOfFameMember[] print) {
System.out.println("Java Sports Hall of Fame Inductees\n\n");
System.out.printf("%-30s\t%-30s\t%-30s\n", "Name", "Year Inducted",
"Sport");
for (int i = 0; i < print.length; i++)
System.out.printf("%-30s\t%-30s\t%-30s\n", print[i].getLastName()
+ "," + print[i].getFirstName(),
print[i].getYearInducted(), print[i].getSport());
}
}
您在此行初始化了阵列:
HallOfFameMember[] tempMembers = new HallOfFameMember[args.length / 4];
但是数组将包含空元素。在尝试调用数组中的方法之前,需要构造数组中的每个元素:
tempMembers[i/4] = new HallOfFameMember();
tempMembers[i/4].setFirstName(args[i]);
该异常意味着tempMembers[i/4]的计算结果为null,当您尝试调用null上的方法时,会得到一个NullPointerException。在本例中,您得到它是因为您还没有在tempMembers中放入任何内容。在Java中,创建数组并不填充它。使用新的HallOfFameMember[args.length/4]创建数组将创建一个具有一定长度的新数组,其所有位置都设置为null。因此,在创建数组之后,您需要在每个数组位置创建并存储一个新的HallofameMember。当您声明tempMembers时,您将初始化数组而不是元素。将其添加到for循环中:
然后您将得到另一个NPE,因为sortedMembers为null,因为您显式地将其设置为null
我还注意到代码中的一些其他奇怪区域。例如,在HallofFameSortMemberShallofMember[]中,为什么要使用while循环,该循环在任何条件下都只运行一次,并在循环期间将bool设置为true和false
将最后四行更改为:
hallOfFameList.setMembers(tempMembers);
final HallOfFameMember[] sortedMembers = tempMembers;
hallOfFameList.sortMembers(tempMembers);
HallOfFame.printReport(sortedMembers);
以解决最后一个异常并获得所需的输出。谢谢。我得到了排序错误。我不知道你到底是什么意思。但我确实犯了一个错误。你的代码修复了它。我必须编写自己的排序方法。我想我的设置方法会奏效。我再看一眼,弄明白它的意思。谢谢你的帮忙!毕竟,这是一个帮助网站。对不起,布尔运算的事情;我误解了密码。我希望你的任务顺利完成!
hallOfFameList.setMembers(tempMembers);
final HallOfFameMember[] sortedMembers = tempMembers;
hallOfFameList.sortMembers(tempMembers);
HallOfFame.printReport(sortedMembers);