2014-12-07 45 views
1

substring返回一个字符串,以指定的索引号开始,直到结尾。 你能告诉我为什么以下不是运行时错误?为什么这不是运行时错误

String s = "Hello"; s.substring(5);

字符串的长度是5,但是最后的指数是4,为什么我没有得到范围例外吗?我得到一个当我说s.substring(6);

请帮助!

+0

[Java:substring index range](http:// stackoverflow .com/questions/4570037/java-substring-index-range) – Joe 2014-12-07 05:22:23

+0

因为有一种方法可以使用这种机制返回一个空字符串。如果不允许这样做,会使某些程序难于编写。这只是Java设计人员做出的一个设计决定,我认为这是正确的,尽管你可以提出一个例子,'substring(6)'也应该返回一个空字符串。 – ajb 2014-12-07 05:35:11

回答

1

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

+0

所以索引在5结束,但编译器允许我去一个结束? – PTheCoolGuy 2014-12-07 05:25:49

+0

@PTheCoolGuy没有。如果你尝试6,它将无法工作。单词“hello”的最后一个索引是4-记住,索引从0开始。 – 2014-12-07 05:26:19

+0

对不起,我把它和另一个字符串混淆了 – PTheCoolGuy 2014-12-07 05:27:16

1

documentation

抛出:IndexOutOfBoundsException - 如果的beginIndex为负或大于这个字符串对象的长度大。

5等于"Hello"的长度,所以是允许的。

+0

好的,那么目的是什么?如果5不在索引中,则不会返回任何内容 – PTheCoolGuy 2014-12-07 05:28:54

+0

@PTheCoolGuy我猜想可以返回一个空字符串,即结尾后的剩余部分为空。 – August 2014-12-07 05:35:03

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); 
} 
1

这是正常现象,API给出了一个类似的例如:

"emptiness".substring(9) returns "" (an empty string) 
相关问题