假设循环中存在以下情况:
LinkedList<String> myList = someMethodReturnsList();
int start = 0, end = 0;
while (end < myList.size() && someOtherCondition)
++end;
List<String> subList = myList.sublist(start, end);
... (do stuff and possibly alter list)
start = end;
我的情况是有时,对sublist
的调用会抛出IndexOutOfBoundsException
。鉴于我对end < myList.size()
的第一次测试,这给我带来了麻烦,所以我写了一些调试代码。我的调试代码告诉我,在while
循环和调用sublist
之间,我的end
值最终为34而myList.size()
返回33。
怎么可能呢?我的程序中没有其他线程可以在此列表中运行,那么我的循环检查如何通过并将end
增加到34?
编辑:这一直发生在我的代码执行的特定点上,所以它不是一个侥幸错误,但它不会发生在这个函数的每个输入上,这使得这更奇怪。
答案 0 :(得分:0)
你所描述的是不可能的。
实际上,发生这种情况的唯一方法是你自己的调试:有一些IDE功能,比如代码元素检查,当应用程序在断点处暂停时执行部分代码。
您必须使用调试工具更改end
的值。
答案 1 :(得分:0)
我的猜测与@Jalitha所说的一样,只有一个:子列表调用应该是:
List<String> subList=myList.sublist(start,end-1);
您有时获得正确数字的原因可能与您的someOtherCondition有关。
请记住,size()比最后一个索引多1个,而subList对索引起作用。
我会把它放在评论中,但由于声誉而无法:(
答案 2 :(得分:0)
啊哈!我通过仔细的调试弄明白了。
事实证明,在发生此异常的循环迭代中,end
值在34处开始。因此,增量循环通过,并且存在索引错误。
原因是在上一次迭代中,myList.size()
为36,但在该循环过程中,删除了3个元素。
答案 3 :(得分:-1)
在我看来,这是一个经典的“一个接一个”的经历。数组错误。您可能end
等于myList.size()
,然后提前一个比您想要的更多。
来自你的while循环,例如如果数组有5个元素:
while (end < 5 && conditions)
{
++end; //results in end being 5
}
然后在它上面
List<String> subList = myList.sublist(0, 5);
和5在边界之外,因为数组只有索引0,1,2,3,4
我认为您应该将其设为while (end+1 < 5 && conditions)
或myList.sublist(0, end-1);
编辑:向@Justen道具,指出我的错误。