为什么不在List.subList(大小,大小)上使用IndexOutOfBoundsException?

时间:2017-04-19 18:51:24

标签: java list arraylist

我正在查看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&gt; = toIndex)?

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您可以检查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证实了这一假设:

  

(如果fromIndextoIndex相等,则返回的列表为空。)