这个循环很奇怪。
我在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();
}
}
}
答案 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);
}