>我已经制作了自己的 ArrayList 类的泛型版本,它需要包含一个从列表中返回随机元素的方法。这是我写的方法:
public T randomElement() throws NoSuchElementException {
T elem;
int rand = (int) (1 + Math.random() * size);
elem = items[rand];
return elem;
}
我正在使用此类/方法从我的列表中选择一个随机元素(使用从.txt文件中获取的字符),并且不断收到 NullPointerException 错误。我可以采取任何协议来确保这种情况不会发生吗?
代码中的问题是计算随机索引rand
的方式:
int rand = (int) (1 + Math.random() * size);
由于1 +
该值可能等于size
这是列表中第一个 empy 空间的索引(至少我假设如此)。因此,在某些情况下,您返回尚未设置的索引的值 - 这是 null
。将其更改为
int rand = (int) (Math.random() * size);
NullPointerException的发生可能是由于以下两件事之一 -
- 项为空。检查条件并返回 null。
- 调用方未处理返回的 null。
无论如何,随机指数的计算是错误的。假设 ArrayList 的大小为 5,Math.random 返回 0.9。在这种情况下,
rand = (int)(1 + 0.9 * 5) = 5
这是 ArrayList 的大小,将导致越界访问。只需删除"1+"