一尘不染

为什么未为“ substring(startIndex,endIndex)”抛出“超出范围”

java

在Java中,我使用的是substring()方法,但不确定为什么它不会引发“索引不足”错误。

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

那么为什么substring(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

阅读 440

收藏
2020-09-08

共1个答案

一尘不染

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

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

实际上,它们提供了一个与您非常相似的示例:

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

我想这意味着最好将Java String视为以下内容,其中包含一个索引|

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

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

2020-09-08