Java索引数组超出界限异常

时间:2012-03-28 09:21:07

标签: java

这个循环很奇怪。

我在Java中运行它,它给出了一个Index out of bounds exception。我在源代码中的任何地方找不到int l声明,我无法弄清楚它是什么,并发现以这种方式声明它是合法的。

但是这里的交易是,我不明白这段代码是做什么的。对于任何大小的resultSIList,它都会给出ArrayIndexOutOfBoundsException

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
    resultSIList.get(i);
}

编辑:谢谢大家。

这是我用来试图理解整个循环的可运行代码。是的,这是一块可怕的垃圾。

public class IndexOutOfBoundsTest {
    public static void main(String args[]){
        int offset = 50;

        int maxItemsInOnePage = 50;

        int totalSIs = 50;

        final int buildThis = 15;

        List resultSIList = new ArrayList();

        // build list
        for(int zz = 0; zz < buildThis; zz ++){
            resultSIList.add("Hi " + zz);
        }

        try{
            for (int i = offset,
                    d = Math.min(i + maxItemsInOnePage, totalSIs);
                    i < d; i++){

               System.out.println(resultSIList.get(i));
           }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

5 个答案:

答案 0 :(得分:2)

此代码将'resulSIList'从'offset'位置循环到'offset + maxItemsInOnePage'和'totalSIs'的最小值。

如果偏移&gt; 0和totalSIs = resultSIList.size()我认为它不会给你一个越界异常。

在您的示例中,您的偏移量为50,列表大小仅为15.您必须检查偏移量是否小于列表大小。

答案 1 :(得分:1)

要获得更多信息,您可以在添加了一些日志记录的情况下运行它:

System.out.println("offset: " + offset);
System.out.println("maxItemsInOnePage: " + maxItemsInOnePage);
System.out.println("totalSIs: " + totalSIs);
System.out.println("resultSIList.size(): " + resultSIList.size());
for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
    System.out.println("i: " + i);
    resultSIList.get(i);
}

运行这个应该可以解决你的问题;得到印刷的最后一个是出界的,通过分析四个首次打印输出,你应该找到你的问题。

答案 2 :(得分:1)

当且仅当 totalSIs等于或小于resultSIList的大小时,它才能正常工作。仔细检查该值。这是一个带有一些随机值的工作示例:

List<Integer> resultSIList = Arrays.asList(1,2,3,4,5,6,7,8);
int totalSIs = resultSIList.size();
int maxItemsInOnePage = 2;
int offset = 1;

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
  resultSIList.get(i);
}

从你添加的代码我看到,totalSIs更大(= 50)然后是列表大小(= 15)。

你可以添加

 totalSIs = resultsSIList.size();

紧跟在for循环后面进行快速修复。

答案 3 :(得分:0)

检查offset是否小于列表大小。

答案 4 :(得分:0)

您应该始终检查索引i是否小于

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs);
      i < l && i < resultSIList.size ();
      i++){
  resultSIList.get(i);
}