所以,如果我有一个大小为3的列表,让我们说[0,1,2]并且我尝试访问索引为3的列表元素(list.get(3)),显然它失败了一个超出范围的异常。但是,使用subList方法,如果我尝试:
list.subList(3, 3);
我得到一个空列表作为结果。根据文件:https://docs.oracle.com/javase/7/docs/api/java/util/List.html#subList(int,%20int)。此方法为非法端点索引值(fromIndex< 0 || toIndex> size || fromIndex> toIndex)抛出IndexOutOfBoundsException。这意味着如果fromIndex == toIndex&& toIndex == size,不会抛出任何异常。
直观地说,这似乎不应该是这种情况,因为如果只有三个,你就无法访问列表的第四个元素。那么为什么这样呢?它是为了满足某些用例还是无意的副作用?
答案 0 :(得分:0)
在documentation you already linked中可以清楚地找到答案。见第一段。特别要注意括号中的短语(我加粗了):
返回指定列表中此列表部分的视图 fromIndex,inclusive,toIndex,exclusive。 (如果fromIndex和 toIndex相等,返回的列表为空。)返回的列表是 此列表支持,因此返回列表中的非结构更改 反映在此列表中,反之亦然。返回的列表支持 此列表支持的所有可选列表操作。
由于您为-
和fromIndex
传递了相同的subList,因此即使索引超出原始列表的范围,您从中获取的List也将为空。
答案 1 :(得分:0)
请参阅。
Why not IndexOutOfBoundsException on List.subList(size, size)?
要考虑API设计师的决定,为什么他们决定这样做 这样,我们可以以String.substring()为例,它具有 相似(相同)的约束。可能允许选择一个空的 字符串/子列表?为此,只会抛出两个异常。
如您所知,在以下情况下会引发异常:
IllegalArgumentException
所以,就您而言 fromIndex = 3,不大于size(3)。 并且不大于toIndex(3)