为什么没有为“子字符串(startIndex,endIndex)”抛出“超出范围”

2022-09-02 19:29:17

在Java中,我正在使用该方法,我不确定为什么它没有抛出“索引不足”错误。substring()

该字符串的索引从 0 开始到 4,但该方法将 startIndex 和 endIndex 作为参数,基于我可以调用 foo.substring(0) 并获取 “abcde” 的事实。abcdesubstring()

那么子字符串(5)为什么工作呢?该指数应该超出范围。这是什么解释?

/*
1234
abcde
*/
String foo = "abcde";
System.out.println(foo.substring(0));
System.out.println(foo.substring(1));
System.out.println(foo.substring(2));
System.out.println(foo.substring(3));
System.out.println(foo.substring(4));
System.out.println(foo.substring(5));

此代码输出:

abcde
bcde
cde
de
e
     //foo.substring(5) output nothing here, isn't this out of range?

当我用6替换5时:

foo.substring(6)

然后我得到错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
    String index out of range: -1

答案 1

根据 Java API 文档,当起始索引大于字符串的长度时,子字符串会引发错误。

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

事实上,他们给出了一个与你的例子非常相似的例子:

"emptiness".substring(9) returns "" (an empty string)

我想这意味着最好将Java字符串视为以下内容,其中索引被包装在:|

|0| A |1| B |2| C |3| D |4| E |5|

也就是说,字符串同时具有开始和结束索引。


答案 2

当你这样做时,它得到子字符串从“e”后面的位置开始,到字符串的末尾结束。顺便说一句,开始和结束位置恰好是相同的。因此,为空字符串。您可以将索引视为不是字符串中的实际字符,而是字符之间的位置。foo.substring(5)

        ---------------------
String: | a | b | c | d | e |
        ---------------------
Index:  0   1   2   3   4   5

推荐