列表大小具有意外值

时间:2016-03-07 22:42:28

标签: java list indexoutofboundsexception

假设循环中存在以下情况:

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?

编辑:这一直发生在我的代码执行的特定点上,所以它不是一个侥幸错误,但它不会发生在这个函数的每个输入上,这使得这更奇怪。

4 个答案:

答案 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道具,指出我的错误。