2016-02-21 35 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+”

相关问题