为什么这不会生成IndexOutOfBoundsException?

时间:2017-08-08 17:10:55

标签: java string indexing

所以,这可能是一个非常愚蠢的问题......但我只是不理解它。

我有String str = "AB",当我致电str.substring(2)时,它不会生成索引超出范围的异常......它也不会返回任何内容,只是&# 34;",我想它应该......

但看到字符串" AB"长度为2,不表示最大指数是1吗?那么从2索引开始调用子字符串会产生IndexOutOfBoundsException吗?当你拨打str.substring(3)时,它会产生一个异常,它应该是,但不是2 ...这对我来说没有意义。

6 个答案:

答案 0 :(得分:6)

According to the JavadocIndexOutOfBoundsException只会被抛出......

  

...如果beginIndex为负数或大于此String对象的长度。

这意味着:由于"AB"长度为2且beginIndex为2,因为2不大于2,所以不会抛出IOOBE。您正确观察3将抛出IOOBE,因为3大于2。

还有助于记住substring来自[n,m],其中m是字符串的长度。如果n = m,那么您将得到数学区间[m,m],by definition is the empty set。从此集合中生成空值将是正确行为。

答案 1 :(得分:5)

思考子字符串索引的一种方法是在字母之间。 0表示开头,2表示结尾。像:

/etc/init.d/*

每个索引选择其右侧的子字符串。在末尾有一个空子串,用索引2选择,因此有三种可能的结果:" AB"," B"和""。

答案 2 :(得分:1)

您可能会注意到:

String str = "AB";
str.substring(2);

根据javadoc有效,因为2不大于"AB"长度:

  

抛出:

     

IndexOutOfBoundsException - 如果beginIndex为负数或大于   这个String对象的长度。

我常常想到同样的问题,但这是一些JDK类依赖索引的方法 例如,ArrayList.add(int index, E element) ArrayList.subList(int, int)的工作方式也相同。

就好像这些方法在最后一个元素之后被认为是一个特殊的插槽。

在某些方法ArrayList.add(int index, E element)中,有意义的是,当索引引用列表的大小时,它用于在列表的末尾添加元素。

例如:

List<String> list = ...
l.add(list.size(),lastElement);

这是表达它的单一方式,因为指定add(list.size()-1, element)会在前一个位置添加元素。

但在substring(int)案例中,用例不太明确,因为

String str = "AB", 
String subStr = str.substring(2);

将始终返回""

但是,Java也是这样运作的。

答案 3 :(得分:0)

subString方法抛出异常 - 如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex。

在您的情况下,您传递单个索引,并将其视为beginIndex 因此,只有当beginIndex为负或大于此String对象的长度时,它才会抛出IndexOutOfBoundsException。

在你的情况下,beginIndex是2,它不大于为什么你得到空子串的长度

答案 4 :(得分:-1)

理解的最佳方法是实际查看源代码(在方法中按ctrl +单击Intellij),这是自我解释的。当然也要看其他答案中提到的javadoc。

 public String substring(int beginIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    int subLen = value.length - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}

答案 5 :(得分:-3)

这是因为您的beginIndex并非否定。

根据Java Doc:

  

抛出:   IndexOutOfBoundsException - 如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex。

如果设置参数:

str.substring(0, 2)

根据文档,它会抛出一个IndexOutOfBoundsException

检查:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int,%20int)