【发布时间】:2016-06-21 16:54:04
【问题描述】:
假设循环中出现以下情况:
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 的?
编辑:这始终发生在我的代码执行的特定点,所以这不是一个侥幸错误,但它不会发生在这个函数的每个输入中,这让这更加奇怪。
【问题讨论】:
-
唯一合乎逻辑的解释是 someOtherCondition 正在修改 List,或者 someMethodReturnsList 保留对 List 的引用并正在修改它。
-
这两个听起来合乎逻辑。然而,
someMethodReturnsList总是创建一个new实例,而someOtherCondition只是从myList的endth 元素中检查一个属性(只读)。 -
有趣。可以同时包含这两个吗?而且,顺便说一句,
LinkedList绝对不是做myList.get(end)和myList.subList的好课。 -
您确定
end的值是 34 而不是 33?不要听起来居高临下之类的。只是说如果它是 33,它仍然会抛出IndexOutOfBoundsException:) -
@JalithaDeSilva 根据
List的文档,如果end为33,则不应抛出它。List.sublist的第二个参数是 exclusive 最后索引。也就是说,end应该能够获得 34 的值是没有任何意义的。
标签: java list indexoutofboundsexception