2012-05-01 48 views
0

我正在開發一個項目,用於要求我獲取.txt文件的類,將數據聚合到不同的對象中,然後根據共享特徵對該列表進行排序。我的指示是使程序能夠導入多達200行的文本。在Java中進行多態性,繼承和數組排序練習

我已經成功實現了導入.txt文件的程序,給定了一個定義的數組大小(如果.txt文件有6行,一個由6個元素組成的數組),但我需要能夠將其定義爲200元素。當超出實際元素的數量時,比如6,它會拋出一個NullPointerException。我似乎無法找到這可能發生的地方,因爲我的代碼至少在視覺上出現,以處理可能發生的任何實例。這裏就是問題發生:

public Solid[] solids; 
public int length; 
public Measurer m; 
public int h; 

public SolidList(int size) { 
    length = 0; 
    solids = new Solid[size]; 
} 

public void addSorted(Solid foo, Measurer m) { 
    int k = 0; 
    if (length != 0) { 
     while ((k < length) && foo.greaterThan(solids[k], m)) 
      ++k; 
     for (int j = length; j > k; --j) 
      solids[j] = solids[j - 1]; 
    } 
    solids[k] = foo; 
    ++length; 
} 

具體地說,Eclipse是遇到在while循環的空指針異常在addSorted(...)。這隻會發生如果數組確實有空元素,但我想我不知道如何防止該方法試圖訪問空元素。

+0

首先,對於原始數組的實例列表,使用java收集要好得多。在這種情況下,尺寸可能不是先驗的。 – gregory561

+0

我與格雷戈裏,檢查出ArrayList - > http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html 你也應該只使用一個Collections.sort用一個比較器來完成排序 - > http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#sort(java.util.List,java.util.Comparator ) –

+0

你真的應該發佈異常堆棧跟蹤。這樣人們只是猜測你的問題。顯示的代碼不會拋出NPE,除非foo爲null。 stacktrace可能會顯示NPE是從'greaterThan'方法中拋出的。 –

回答

5
if (length != 0) { 
    while ((k < length) && solids[k] != null && foo.greaterThan(solids[k], m)) 
     ++k; 
    if(solids[k] == null) { 
     return; 
    } 
    for (int j = length; j > k; --j) 
     solids[j] = solids[j - 1]; 
} 

可能解決問題。但是你應該真的考慮使用集合(查看ArrayList)來處理動態輸入長度的集合/數組。

+0

嗯,是/成爲家庭作業標記 - 我應該刪除? – esej

+0

啊,現在我明白了。那麼我會刪除我的評論。 –

+0

我應該把它標記爲家庭作業 - 對不起!這是我在這裏的第一篇文章,我仍然在學習規則。我會使用一個ArrayList,但我們被限制在這個類的持續時間內使用數組。可以理解,但它會更難。感謝您的幫助! – idigyourpast

3

我想不通如何防止方法試圖訪問空元素。

在做任何使用它作爲值之前,檢查數組的特定索引是否等於null