Java索引数组超出范围
此循环很奇怪。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();
}
}
}
它将按预期当且仅当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循环速战速决。
嗨安德烈亚斯,我认为你是对的这个。你有任何想法,如果这是像一个代码错误的东西,或者它真的试图做一些事情吗? – 2012-03-28 09:50:36
它可能在上下文中做了一些合理的事情 - 我不知道,你所展示的代码是一种非常复杂的方式来抛出AIOOBE;) – 2012-03-28 09:55:22
检查offset
是否小于您的列表大小。
如果'offset'大于或等于(可能是'totalSIs'),那么'for'身体不会运行(由于'我
此代码将'resulSIList'从'offset'位置循环到'offset + maxItemsInOnePage'和'totalSIs'的最小值。
如果offset> 0且totalSIs = resultSIList.size()我认为它不会给你一个越界异常。
在您的示例中,您的偏移量为50,列表大小仅为15.您必须检查偏移量是否小于列表大小。
得到一些你可以运行它与一些日志添加了更多的信息:
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);
}
运行这应该阐明你的问题的一些光;我打印的最后一张图片是不受限制的,并且通过分析四个首次打印输出,您应该可以找到您的问题。
您应经常检查自己是否您的索引小规模
for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs);
i < l && i < resultSIList.size();
i++){
resultSIList.get(i);
}
我有一个词给你:调试器。逐步了解行为如何不符合您的假设。 – duffymo 2012-03-28 09:23:20
你可以有一个消极的'抵消'? – 2012-03-28 09:24:01
resultSIList的大小是多少 – 2012-03-28 09:25:52