substring返回一个字符串,以指定的索引号开始,直到结尾。 你能告诉我为什么以下不是运行时错误?为什么这不是运行时错误
String s = "Hello";
s.substring(5);
字符串的长度是5,但是最后的指数是4,为什么我没有得到范围例外吗?我得到一个当我说s.substring(6);
请帮助!
substring返回一个字符串,以指定的索引号开始,直到结尾。 你能告诉我为什么以下不是运行时错误?为什么这不是运行时错误
String s = "Hello";
s.substring(5);
字符串的长度是5,但是最后的指数是4,为什么我没有得到范围例外吗?我得到一个当我说s.substring(6);
请帮助!
s.substring()
如果您在最后一个索引上方调用索引1,实际上并不会抛出一个方法。这是非常有帮助的,因为这样你不需要用这样的forloops担心:
for(int i = 0; i < string.length - 1; i++) {
System.out.println(s.substring(i, i+1));
}
无需对的最后指数专项检查,它会只是工作。
你可以看到Java Docs为更技术性的答案 - s.substring()
将只会抛出一个错误,如果索引大于字符串的长度,而不仅仅是索引的数量。
有关更多信息,请参见this question。
所以索引在5结束,但编译器允许我去一个结束? – PTheCoolGuy 2014-12-07 05:25:49
@PTheCoolGuy没有。如果你尝试6,它将无法工作。单词“hello”的最后一个索引是4-记住,索引从0开始。 – 2014-12-07 05:26:19
对不起,我把它和另一个字符串混淆了 – PTheCoolGuy 2014-12-07 05:27:16
好的,那么目的是什么?如果5不在索引中,则不会返回任何内容 – PTheCoolGuy 2014-12-07 05:28:54
@PTheCoolGuy我猜想可以返回一个空字符串,即结尾后的剩余部分为空。 – August 2014-12-07 05:35:03
它为什么不抛出异常的原因是因为在这两个参数的版本:
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);
}
这是正常现象,API给出了一个类似的例如:
"emptiness".substring(9) returns "" (an empty string)
[Java:substring index range](http:// stackoverflow .com/questions/4570037/java-substring-index-range) – Joe 2014-12-07 05:22:23
因为有一种方法可以使用这种机制返回一个空字符串。如果不允许这样做,会使某些程序难于编写。这只是Java设计人员做出的一个设计决定,我认为这是正确的,尽管你可以提出一个例子,'substring(6)'也应该返回一个空字符串。 – ajb 2014-12-07 05:35:11