考虑以下场景:
String str = "str";
System.out.println("str subs: " + str.substring(3,3));
预期结果:(
StringIndexOutOfBoundsException
因为 beginIndex 在字符串结束“之后”开始)
实际结果:
打印空字符串
从String.java:
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}
很容易看出,实现没有处理以下边缘情况:(
beginIndex == endIndex == count
是count
字符串的长度)。
根据手册,方法子字符串:
返回一个新字符串,它是该字符串的子字符串。子字符串从指定的 beginIndex 开始并延伸到索引 endIndex - 1 处的字符。因此子字符串的长度是 endIndex-beginIndex。
它还指出该方法抛出:
IndexOutOfBoundsException - 如果 beginIndex 为负数,或者 endIndex 大于此 String 对象的长度,或者 beginIndex 大于 endIndex。
考虑 case: as valid
是否有意义?我错过了什么吗?beginIndex == endIndex == count