随机生成对象列表后得到outofboundsexception

时间:2012-07-17 15:03:38

标签: java math random arraylist indexoutofboundsexception

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

现在我有一个大小为10的int数组,我想在其中随机存储十个对象但是有效的qid。意味着这十个对象必须来自那些16个而不是来自那些对象。

我正在做以下

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个有效对象的原始列表,其中包含26个对象中有效的qid,其中max = 31且min = 6。
  2. finalList =最终列表,其中将存储随机选择的10个对象(16个中的16个中的一个)。
  3. checkList =大小为10的整数数组,其中只存储随机选择的10个finalList对象的qid(不是其他属性)。
  4. 我得到了indexoutofboundsexception。有人能帮助我吗?

2 个答案:

答案 0 :(得分:0)

由于你在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]的值打印出来进行调试!

答案 1 :(得分:0)

从您的评论(现在显然已删除)中,问题似乎是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