【问题标题】:Why is this not a run time error为什么这不是运行时错误
【发布时间】:2015-02-05 00:56:00
【问题描述】:

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

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

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

请帮忙!

【问题讨论】:

  • 因为有一种使用这种机制返回空字符串的方法很重要。如果不允许这样做,将会使某些程序更难编写。这只是 Java 设计人员做出的一个设计决定,我认为这是正确的决定,尽管您可以提出 substring(6) 也应该返回一个空字符串的情况。

标签: java


【解决方案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 了解更多信息。

【讨论】:

  • 所以索引以 5 结束,但编译器允许我再过去一次?
  • @PTheCoolGuy 不。如果您尝试 6,它将无法正常工作。单词“hello”的最后一个索引是 4 - 请记住,索引从 0 开始。
  • 对不起,我把它和另一个字符串弄混了
  • 所以这里的索引是 4 但s.subsrtring(5) 是允许的
  • 你的答案总是赞不绝口
【解决方案2】:

来自documentation

抛出:IndexOutOfBoundsException - 如果 beginIndex 为负数或大于此 String 对象的长度

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

【讨论】:

  • 好的,那么目的是什么?如果 5 不在索引内,则不会返回任何内容
  • @PTheCoolGuy 我想这样可以返回一个空字符串,即结束后的剩余部分为空白。
【解决方案3】:

之所以不抛出异常,是因为在两个参数版本中:

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

【讨论】:

    【解决方案4】:

    这是预期行为,API 给出了类似的示例:

    "emptiness".substring(9) returns "" (an empty string)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 2014-07-23
      • 2016-04-20
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多