2012-03-28 67 views
0

此循环很奇怪。Java索引数组超出范围

我在Java中运行它,它给出了一个索引越界异常。我无法在源代码的任何地方找到一个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(); 
     } 
    } 
} 
+0

我有一个词给你:调试器。逐步了解行为如何不符合您的假设。 – duffymo 2012-03-28 09:23:20

+1

你可以有一个消极的'抵消'? – 2012-03-28 09:24:01

+0

resultSIList的大小是多少 – 2012-03-28 09:25:52

回答

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循环速战速决。

+0

嗨安德烈亚斯,我认为你是对的这个。你有任何想法,如果这是像一个代码错误的东西,或者它真的试图做一些事情吗? – 2012-03-28 09:50:36

+0

它可能在上下文中做了一些合理的事情 - 我不知道,你所展示的代码是一种非常复杂的方式来抛出AIOOBE;) – 2012-03-28 09:55:22

0

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

+1

如果'offset'大于或等于(可能是'totalSIs'),那么'for'身体不会运行(由于'我 2012-03-28 09:26:34

2

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

如果offset> 0且totalSIs = resultSIList.size()我认为它不会给你一个越界异常。

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

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); 
} 

运行这应该阐明你的问题的一些光;我打印的最后一张图片是不受限制的,并且通过分析四个首次打印输出,您应该可以找到您的问题。

0

您应经常检查自己是否您的索引小规模

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