substring返回一个以指定的索引号开头一直到结尾的字符串。 你能告诉我为什么以下不是运行时错误吗?
String s = "Hello";
s.substring(5);
字符串的长度是5,但最后一个索引是4,那么为什么我没有得到范围的异常?当我说s.substring(6);
请帮忙!
答案 0 :(得分:1)
s.substring()
实际上不会抛出一个方法。这非常有用,因为那样你就不用担心像这样的forloops:
for(int i = 0; i < string.length - 1; i++) {
System.out.println(s.substring(i, i+1));
}
无需对最后一个索引进行特殊检查,它只会起作用。
您可以看到Java Docs获得更多技术性答案 - s.substring()
只会在索引大于字符串的LENGTH时抛出错误,而不仅仅是索引的数量。
有关详细信息,请参阅this question。
答案 1 :(得分:1)
答案 2 :(得分:1)
它不抛出异常的原因是因为在两个参数版本中:
substring(int beginIndex, int endIndex)
endIndex
是独家的。当您使用的单个参数版本指定字符串的长度时,行为与两个参数版本一致,因此将其视为独占。结果是一个空字符串。
单参数版本的实际实现是:
public String substring(int beginIndex) {
return substring(beginIndex, count);
}
作为参考,两个参数版本的实际实现是:
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);
}
答案 3 :(得分:1)
这是预期的行为,API给出了一个类似的例子:
"emptiness".substring(9) returns "" (an empty string)