我正在查看List.subList()方法。我想知道为什么下面的代码不会引发IndexOutOfBoundsException。
ArrayList<String> someList = new ArrayList<>();
someList.add("A");
someList.add("B");
someList.add("C");
someList.add("D");
someList.add("E");
someList.subList(5, 5);
文档说subList是subList(fromIndex,toIndex),其中fromIndex包含在内。由于我的list.size()是5,所以索引从0到4。所以,如果fromIndex是包容性的,不应该抛出异常吗?
从文档:
fromIndex - low endpoint (inclusive) of the subList
toIndex - high endpoint (exclusive) of the subList
IndexOutOfBoundsException - for an illegal endpoint index value (fromIndex < 0 || toIndex > size || fromIndex > toIndex)
我在这里了解布尔表达式。但是不应该是(... || fromIndex> = toIndex)吗?
我想念什么?
最佳答案
您可以准确地检查ArrayList
的实现,其中IndexOutOfBoundsException的标准是:
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
static void subListRangeCheck(int fromIndex, int toIndex, int size) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex > size)
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex + ")");
}
因此您可以看到,由于
toIndex == size
,不会引发异常。为了考虑API设计者为何决定采用这种方式的决定,我们可以举一个
String.substring()
为例,它具有非常相似(相同)的约束。可能允许选择一个空字符串/子列表?此外,the documentation确认了以下假设:
(如果
fromIndex
和toIndex
相等,则返回的列表为空。)