当我尝试使用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?
答案 0 :(得分:1)
这是因为substring(start, end)
函数指定了包含start
和独占end
索引。
这样,你可以指定一个大于最大索引的index
来表示你想要一直走到字符串的末尾(尽管在那种情况下,你应该只使用自动抓取到字符串末尾的单参数substring(start)
。
如果您以编程方式调用substring(start, end)
函数并计算start
和end
值,而不必检查字符串的大小并调用单个字符串,则此功能非常有用-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