为何这些情况未抛出IndexOutOfBoundsException异常?
为什么String.substring()某些看似越界的情况不抛出IndexOutOfBoundsException?
嘿,这个问题戳中了Java String方法里很容易被忽略的细节!先给你明确一下substring(int beginIndex, int endIndex)的官方规则——它的参数限制其实比你以为的更灵活,并非只要涉及负数或等于length()就会报错:
核心参数规则
调用substring(begin, end)时,只有满足以下任意一种情况才会抛出IndexOutOfBoundsException:
beginIndex < 0endIndex > 字符串的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
相关产品推荐
相关产品推荐

