当我使用java substring(int beginIndex,int endIndex)时,为什么没有抛出IndexOutOfBoundsException,即使我的参数超出界限?

时间:2018-04-25 01:08:41

标签: java

当我尝试使用substring()方法时,我发现即使endIndex超出范围,java也没有在此代码中抛出IndexOutOfBoundsException

String str1 = "abcdefg";
System.out.println(str1.substring(3,7));

当我将endIndex更改为8时,java在此代码中抛出了IndexOutOfBoundsException

String str1 = "abcdefg";
System.out.println(str1.substring(3,8));

我已经阅读了有关这种子字符串形式的文档 https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#substring-int-int-

我只记得在C之类的其他编程语言中,有一个字符串,称为以null结尾的字符串,它添加在字符串的末尾 这是我的一些参考资料 https://en.wikipedia.org/wiki/Null-terminated_string https://www.tutorialspoint.com/cprogramming/c_strings.htm

所以,我只是想知道,java是否在字符串末尾添加了一个以null结尾的String,这就是为什么这段代码片段“System.out.println(str1.substring(3,7));”没有抛出IndexOutOfBoundsException?

3 个答案:

答案 0 :(得分:1)

这是因为substring(start, end)函数指定了包含start和独占end索引。

这样,你可以指定一个大于最大索引的index来表示你想要一直走到字符串的末尾(尽管在那种情况下,你应该只使用自动抓取到字符串末尾的单参数substring(start)

如果您以编程方式调用substring(start, end)函数并计算startend值,而不必检查字符串的大小并调用单个字符串,则此功能非常有用-argument version。

答案 1 :(得分:1)

从您链接到的文档:

  

子字符串从指定的beginIndex开始,并扩展到索引endIndex - 1处的字符。

所以str1.substring(3,7)实际上是从索引3到索引6的子字符串。

答案 2 :(得分:0)

其他2个解决方案中所述的内容是正确的。当你这样做时:

String str1 = "abcdefg";
System.out.println(str1.substring(3,7));

这就是:

          v        v
[a][b][c][d][e][f][g]          --- return "defg"   
[0][1][2][3][4][5][6][7]       --- Grabbing index 3 to 6

它从索引3到6读取,因为子串在所述的最终索引之前读取1个字符。

但是,当你这样做时:

String str1 = "abcdefg";
System.out.println(str1.substring(3,8));

这就是:

          v           v
[a][b][c][d][e][f][g]          --- out of bounds, trying to read after last character   
[0][1][2][3][4][5][6][7]       --- Grabbing index 3 to 7