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

为何这些情况未抛出IndexOutOfBoundsException异常?

为什么String.substring()某些看似越界的情况不抛出IndexOutOfBoundsException?

嘿,这个问题戳中了Java String方法里很容易被忽略的细节!先给你明确一下substring(int beginIndex, int endIndex)的官方规则——它的参数限制其实比你以为的更灵活,并非只要涉及负数或等于length()就会报错:

核心参数规则

调用substring(begin, end)时,只有满足以下任意一种情况才会抛出IndexOutOfBoundsException:

  • beginIndex < 0
  • endIndex > 字符串的length()
  • beginIndex > endIndex

反之,只要0 ≤ beginIndex ≤ endIndex ≤ length(),方法就会正常执行,返回对应的子串。

针对你提到的疑惑场景逐一解释:

1. 关于“从索引0到-1”的情况

首先要纠正:如果真的写了str.substring(0, -1),这时候beginIndex(0) > endIndex(-1),是一定会抛出异常的!你大概率是记错了实际测试的代码——比如你可能测试的是str.substring(0, 0)?这种情况下:

  • beginIndex=0,endIndex=0,完全满足0 ≤ 0 ≤ 0 ≤ str.length()的合法范围
  • 按照“返回从i到k-1的子串”的通俗说法,当i和k相等时,相当于没有字符被包含,所以返回空字符串,完全符合规则,自然不会报错。

2. 关于和length()相关的情况

比如str.substring(str.length(), str.length())或者单参数的str.substring(str.length()):

  • 单参数的substring(beginIndex)本质等价于substring(beginIndex, str.length())
  • 当beginIndex == str.length()时,起始索引等于结束索引,同样落在合法范围内,所以返回空字符串,不会触发异常。
  • 但如果写str.substring(str.length() + 1)或者str.substring(0, str.length() + 1),这时候参数超出了字符串长度,就会立刻抛出越界异常。

一句话总结

substring的参数允许起始/结束索引等于字符串长度,也允许两者相等(返回空串)——只有当参数小于0、超过长度,或者起始索引大于结束索引时,才会触发IndexOutOfBoundsException。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:47:26