【问题标题】:Returning a random element from my custom ArrayList class? [closed]从我的自定义 ArrayList 类中返回一个随机元素? [关闭]
【发布时间】:2016-02-21 23:04:05
【问题描述】:

我已经制作了自己的 ArrayList 类的通用版本,它需要包含一个从列表中返回随机元素的方法。这是我写的方法:

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

    return elem;
}

我正在使用此类/方法从我的列表中选择一个随机元素(使用从 .txt 文件中获取的字符)并且我不断收到 NullPointerException 错误。我可以采取任何协议来确保不会发生这种情况吗?

【问题讨论】:

  • 您在哪一行得到空指针异常?
  • items 是否已初始化?
  • 你得到的 NPE 是什么?如果您正在讨论在调用代码中获取 NPE,因为此方法有时会返回 null,那么您可以在删除元素时压缩后备数组,就像 java.util.ArrayList 所做的那样。
  • 是的,只有一个协议:确保items != null

标签: java arrays generics arraylist nullpointerexception


【解决方案1】:

您的代码中的问题是您计算随机索引rand 的方式:

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

由于1 +,该值可能等于size,这是您列表中第一个空白空间的索引(至少我假设如此)。 因此,在某些情况下,您会返回尚未设置的索引的值——即null。 改成

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

【讨论】:

  • 不会/不应该导致 NoSuchElementException 而不是 NullPointerException?
  • 为什么会这样?该方法没有任何检查。如果items 已满,它可能会导致 ArrayIndexOutOfBounds。这个问题应该澄清 NPE 发生在哪里......
  • 对不起,是的,它由一个数组支持,所以在我看来,我希望 ArrayIndexOutOfBoundsException :) 假设数组的大小与列表的大小相同。不过,我从来没有看过 ArrayList 是如何实现的。
  • 1 + 无论如何也没用,因为索引 0 是有效索引。
  • 在 ArrayList 中,后备数组可以大于列表的当前大小。您只需保留指向下一个空闲索引的指针 :)
【解决方案2】:

NullPointerException 的发生可能是由于以下两件事之一 -

  1. 项目为空。检查条件并返回 null。
  2. 调用方未处理返回的 null。

无论如何,随机索引的计算都是错误的。假设 ArrayList 的大小为 5,Math.random 返回 0.9。在这种情况下,

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

这是 ArrayList 的大小,将导致越界访问。只需删除“1+”

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多