2011-09-25 102 views
0

好的,我有一个家庭作业。我原本以为一切好就可以了,我正在一个作业:“线程中的异常”main“java.lang.NullPointerException”

"Exception in thread "main" java.lang.NullPointerException at HW3.main<HW3.java:18>

这条线是:

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()); 
    } 

} 

回答

5

你初始化你在这条线阵:

HallOfFameMember[] tempMembers = new HallOfFameMember[args.length/4]; 

但阵列将包含null元素。你需要构建的每个元素的数组中尝试之前调用它的方法:

tempMembers[i/4] = new HallOfFameMember(); 
tempMembers[i/4].setFirstName(args[i]); 
+0

谢谢。修正了那个错误 – Zankorel

0

例外意味着tempMembers[i/4]计算结果为null,当你尝试致电零点的方法,你会得到一个NullPointerException。在这种情况下,你得到它,因为你还没有将任何东西放入tempMembers。在Java中,创建数组不会填充它。使用new HallOfFameMember[args.length/4]创建阵列会创建一个长度为一个新阵列,并将其所有位置设置为null。因此,在创建阵列后,您需要在每个阵列位置创建并存储新的HallOfFameMember

3

当你声明tempMembers,你初始化数组不是元素。添加到您的for循环:

tempMembers[i/4] = new HallOfFameMember(); 

然后你会得到另一个NPE因为sortedMembers为空(因为你是明确将其设定为)。

我也注意到你的代码中的一些其他奇怪的地方。例如,在HallOfFame#sortMembers(HallOfFameMember[])中,为什么使用while循环在任何情况下都会运行一次(在循环过程中将bool设置为true,并将其设置为false)?

改变最后四行:

hallOfFameList.setMembers(tempMembers); 
final HallOfFameMember[] sortedMembers = tempMembers; 
hallOfFameList.sortMembers(tempMembers); 
HallOfFame.printReport(sortedMembers); 

解决的最后一个异常,并得到所需的输出。

+0

谢谢。我得到了排序错误。不确定你对布尔的真正含义。但我确实收到错误。你的代码修复了它。我不得不写我自己的排序方法。我想到了我设置它的方式会起作用。我再看看它是否有意义。再次谢谢 – Zankorel

+0

没问题!毕竟,这是一个帮助网站。对于布尔事物抱歉;我误解了代码。我希望你的任务能够实现! – wchargin

相关问题