为何Java substring方法参数越界时未抛出IndexOutOfBoundsException?
关于Java String.substring()的索引边界问题解答
这问题我刚入门Java的时候也困惑过!其实关键是要搞清楚substring(int beginIndex, int endIndex)方法的参数定义细节:
beginIndex:子串的起始索引,包含该位置的字符,取值范围必须是0 ≤ beginIndex ≤ 字符串长度endIndex:子串的结束索引,不包含该位置的字符,取值范围必须是beginIndex ≤ endIndex ≤ 字符串长度
拿你的例子来说,"abcdefg"的长度是7,字符对应的索引是0到6(a=0, b=1, ..., g=6):
- 当你调用
str1.substring(3,7)时,endIndex=7刚好等于字符串的长度,这是完全合法的——方法会从索引3(字符'd')开始,一直取到索引6(字符'g'),也就是返回"defg",不会触发异常。 - 而当你把
endIndex改成8时,8已经超过了字符串的长度7,违反了参数规则,所以就会抛出IndexOutOfBoundsException。
官方文档里其实明确了这个规则:只有当endIndex大于字符串长度,或者beginIndex大于endIndex的时候,才会抛出索引越界异常;而endIndex等于字符串长度是被允许的,等价于截取到原字符串的末尾。
给你再贴个代码对比更直观:
String str1 = "abcdefg"; // 合法:endIndex等于字符串长度,返回从索引3到末尾的子串 System.out.println(str1.substring(3,7)); // 输出 "defg" // 非法:endIndex超过字符串长度,抛出异常 System.out.println(str1.substring(3,8)); // 抛出 IndexOutOfBoundsException
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

