为什么这不是运行时错误

时间:2014-12-07 05:19:54

标签: java

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

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

字符串的长度是5,但最后一个索引是4,那么为什么我没有得到范围的异常?当我说s.substring(6);

时,我得到一个

请帮忙!

4 个答案:

答案 0 :(得分:1)

如果你在最后一个索引之上调用索引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)

来自documentation

  

引发:IndexOutOfBoundsException - 如果beginIndex为负或大于此String对象的长度

5等于"Hello"的长度,因此允许。

答案 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)