2011-09-25 86 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

相關問題