2016-02-21 34 views
0

我已經制作了我自己的ArrayList類的泛型版本,它需要包含一個從列表中返回一個隨機元素的方法。這是我寫的方法:從我的自定義ArrayList類返回一個隨機元素?

public T randomElement() throws NoSuchElementException { 
    T elem; 
    int rand = (int) (1 + Math.random() * size); 
    elem = items[rand]; 

    return elem; 
} 

我使用這個類/方法來接從我的列表中隨機元素(使用.txt文件取個字符),我不斷收到NullPointerException錯誤。我能採取哪些協議來確保不會發生?

+2

你會得到一個空指針異常的哪一行? – Gavin

+1

是'items'初始化? – Mureinik

+0

你得到什麼NPE?如果你正在討論在調用代碼中獲取NPE,因爲這個方法有時返回null,那麼當你移除一個元素時,你可以使你的後備數組緊湊化,比如java.util.ArrayList。 – azurefrog

回答

2

在你的代碼的問題是,你計算隨機指標rand方式:

int rand = (int) (1 + Math.random() * size); 

因爲1 +值可能等於size這是第一個empy空間的索引列表中(至少我假設)。 因此,在某些情況下,您將返回尚未設置的索引的值 - 即null。 將其更改爲

int rand = (int) (Math.random() * size); 
+0

不會/不應該導致NoSuchElementException而不是NullPointerException? – Gavin

+0

爲什麼呢?沒有任何方法檢查。雖然'items'已滿,但可能會導致ArrayIndexOutOfBounds。這個問題應該闡明NPE在哪裏發生.... – MartinS

+0

不好意思,是它支持一個數組,所以在我看來我期望ArrayIndexOutOfBoundsException :)假設數組的大小與列表的大小相同。我從來沒有看過ArrayList是如何實現的。 – Gavin

1

的NullPointerException異常可能是因爲兩兩件事來發生 -

  1. 項目爲空。檢查條件並返回null。
  2. 調用者沒有處理返回的null。

在任何情況下,隨機指標的計算都是錯誤的。假設ArrayList的大小是5,Math.random返回0.9。在這種情況下,

rand = (int)(1 + 0.9 * 5) = 5 

這是ArrayList的大小,並且會導致超出邊界的訪問。只要刪除「1+」

相關問題