首页 > 解决方案 > 为什么不使用字符串的长度作为开始索引调用子字符串抛出 OutOfBoundsException?

问题描述

在测试一些代码时,我注意到如果我使用的索引等于字符串的长度,则 substring 方法不会抛出异常。例如:

String s = "holy";
System.out.println(s.substring(4));

输出不会返回任何内容,但不会引发异常。但如果我试图打电话:

String s = "holy";
System.out.println(s.substring(5));

它会抛出一个 IndexOutOfBoundsException。我阅读了该方法的Javadoc,它说

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

任何人都知道为什么它允许开始索引等于字符串长度?

标签: java

解决方案


想想其他的调用substring

"holy".substring(n)

可以可视化为复制n(包括)和字符串结尾(不包括)之间的字符范围。

例如:

"holy".substring(0)`

 h o l y
O-------X    (O = start, X = end)
0 1 2 3 4

即开始位置正好在字符之前,结束位置正好在字符之后。在这种情况下,字符串的结果长度为end - start, 4。

"holy".substring(1)

 h o l y
  O-----X     // length = 4 - 1 = 3.
0 1 2 3 4

等等然后:

"holy".substring(4)

可以可视化为

 h o l y
        O     // O and X are at the same position
        X     // length = 4 - 4 = 0
0 1 2 3 4

O 和 X 在同一个位置很好:它只是意味着结果是一个零长度的字符串,"".

但是,将索引增加到 5:

"holy".substring(5)

 h o l y
        X-O    // O is after X
               // length = 4 - 5 = -1 (?!)
0 1 2 3 4 5

长度为 -1 的字符串没有意义,因此例外。


推荐阅读