【问题标题】:getting outofboundsexception after random generation of object list随机生成对象列表后出现outofboundsexception
【发布时间】:2012-07-16 13:05:33
【问题描述】:

我有一个对象列表,每个对象都有一些“qid”。 qid 是整数。列表的“qid”从任何不说的“min”开始,到任何不说的“max”结束。请注意,列表中对象的“qid”不是连续的。意味着例如: min = 6 和 max = 31 但其中只有 16 个对象,它们的 qid 在 [min,max] (包括最小值和最大值),因此没有任何对象存在 (31-6+1 )-16 = 10 qids。意思是这十个qid,没有任何对象存在。但是只有 16 个对象具有有效的 qid。

现在我有一个大小为 10 的 int 数组,我想在其中随机存储 10 个对象,但它们的 qid 有效。表示这十个对象必须来自这 16 个而不是来自这 26 个。

我正在做以下事情

for (int j = 0; j < 10; j++) {
    checkList[j] = min + (int) (Math.random() * ((max - min) + 1));
    if (qidList.get(checkList[j]) == null ) {
        j--;
        continue;
    } else {
        finalList.add(j,qidList.get(checkList[j])); 
    }
}
  1. qidList = 原始列表,包含 16 个有效对象,其中 qid 有效,26 个对象,最大值 = 31,最小值 = 6。
  2. finalList = 将存储随机选择的 10 个对象(16 个不是 26 个)的最终列表。
  3. checkList = 大小为 10 的整数数组,其中仅存储随机选择的 10 个 finalList 对象的 qid(而非其他属性)。

我收到indexoutofboundsexception。有人可以帮我吗?

【问题讨论】:

  • 究竟哪一行给出了越界?
  • qidList 的类型是什么?它是一个 ArrayList 吗?
  • 不是 ObjectList。对不起。我不清楚哪条线的例外。因为我没有收到任何服务器错误日志。只有浏览器显示 outofboundsException。我现在该怎么办..?
  • 我认为我们帮助您的部分问题是您对各种列表中确切包含的内容的解释并不完全清楚,尤其是第一段的最后两三句话。问题似乎很明显,有些 checkList[j] 不包含在 qidList 中,但除此之外,如果没有更多上下文,很难说为什么。

标签: java math random arraylist indexoutofboundsexception


【解决方案1】:

由于您在 for 循环中递减 j,您可能会超过 0(即 -1 及以上),这会引发 indexOutOfBounds

编辑:

基于错误发生在“qidList.get(checkList[j]) == null”行的注释,那么显然qidList没有checkList[j],这意味着“checkList[j] = min + (int) (Math.random() * ((max - min) + 1));"正在设置为 qidList 大小之外的值!

打印出checkList[j]的值来调试!

【讨论】:

  • 我认为这不可能,因为有一个“继续;”紧接在 j-- 之后;这意味着 j-- 每个循环最多会发生一次,并且因为它也会在每个循环中递增一次……不过我可能是错的
  • 嗨 barbiepylon :我接受 j 在循环内递减,只有当采用无效 qid 时才会减少。然后我设置 continue 并且 j 再次用 j++ 递增,如 for 循环中所示并返回到其先前的位置。如果为 0,则为 0,如果为 3,则为 3。那有什么害处。当我确定 26 个中有 16 个有效时。?
  • 哦,我搞错了 continue 到底做了什么。
  • 阅读我的编辑。您正在将 checkList[j] 设置为 列表大小。在checkList[j]下面添加打印语句,看看值是什么!
  • 在不知道最小值和最大值等于多少的情况下,很难说出确切的问题。例如,max = 31,min = 6。您的 checkList[j] 可能 = 32. 6 + (int) (1 * (31 - 6) + 1) = 32。如果 qidList 只有 16 个对象,那么显然 qidList .get(32) 超出范围!
【解决方案2】:

从您的评论(现在显然已删除)看来,问题出在qidList.get 上,好像问题出在checkList[j] 上一样,它会在之前的行上抛出异常。因此,检查 max 是否小于 qidList 的大小。如果没有,您可以在 get 方法上获得以下 IndexOutOfBoundsException。来自List API

IndexOutOfBoundsException - if the index is out of range (index < 0 || index >= size())

更新: 为了防止这种情况,请将其更改为以下内容:

if ((checkList[j] >= qidList.size()) || (qidList.get(checkList[j]) == null)) {
    j--;
    continue;
}

或者更好的是,在进入循环之前将max 设置为qidList.size() - 1

【讨论】:

  • 是的,我已经按照你所说的做了这些。但问题仍然存在。实际上在打印 checkList[] 之后,我看到了一些无效的 qid。即使按照您所说的进行更改,我也不知道它是从哪里生成的。
  • @Rambo:您可能会考虑添加一些 System.println() 语句来输出可能导致问题的不同值,和/或设置调试断点并遍历该方法直到它出错之前,和应该清楚它失败的原因(其中一个数组上的索引太大或太小)。
猜你喜欢
  • 2014-05-13
  • 2019-08-02
  • 1970-01-01
  • 2015-07-30
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多