You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:02:36