【问题标题】:String substring index could be the length of string字符串子字符串索引可以是字符串的长度
【发布时间】:2014-05-08 22:43:39
【问题描述】:

这是一个 Java 字符串问题。我使用substring(beginindex) 来获取子字符串。 考虑到String s="hello",这个字符串的长度是5。但是当我使用s.substring(5)s.substring(5,5)时,编译器没有给我错误。字符串的索引应该从0开始长度为 1。 为什么它不适用于我的情况?我认为s.substring(5) 应该给我一个错误,但它没有。

【问题讨论】:

  • s.substring(s.length()) 愚蠢但有效
  • “我认为当我使用 s.substring(5) 时,它应该给我错误,而它没有” - 不要依赖你的直觉。阅读 javadocs。他们说不应该。

标签: java string substring


【解决方案1】:

因为endIndex 是独占的,如documentation 中所指定。

IndexOutOfBoundsException - 如果 beginIndex 为负数,或者 endIndex 大于此 String 对象的长度,或 beginIndex 为 大于 endIndex。


我认为当我使用 s.substring(5) 时,它应该会给我错误 没有

为什么会这样?

返回一个新字符串,它是该字符串的子字符串。子串 从指定索引处的字符开始并延伸到 这个字符串的结尾。

由于beginIndex 不大于endIndex(在您的情况下为5),因此它完全有效。你只会得到一个空字符串。

如果你看source code

1915  public String substring(int beginIndex) {
1916      return substring(beginIndex, count);
1917  }
....
1941  public String substring(int beginIndex, int endIndex) {
1942      if (beginIndex < 0) {
1943          throw new StringIndexOutOfBoundsException(beginIndex);
1944      }
1945      if (endIndex > count) {
1946          throw new StringIndexOutOfBoundsException(endIndex);
1947      }
1948      if (beginIndex > endIndex) {
1949          throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
1950      }
1951      return ((beginIndex == 0) && (endIndex == count)) ? this :
1952          new String(offset + beginIndex, endIndex - beginIndex, value);
1953  }

因此,s.substring(5); 等同于 s.substring(5, s.length());,在您的情况下为 s.substring(5,5);

当你调用s.substring(5,5); 时,它返回一个空字符串,因为你调用构造函数(它是私有包),count 值为 0(count 表示字符串中的字符数):

644 String(int offset, int count, char value[]) {
645         this.value = value;
646         this.offset = offset;
647         this.count = count;
648 }

【讨论】:

  • 但它没有索引 ==5。但我可以使用 s.substring(5)?为什么
  • @user3382017 s.substring(5); 等价于 s.substring(5, s.length());,即“Hello”的 s.substring(5,5);
【解决方案2】:

因为substring是这样定义的,所以你可以在the Javadoc of String.substring找到它

@exception IndexOutOfBoundsException 如果 beginIndex 为负数, 或 endIndex 大于此 String 对象的长度,或 beginIndex 大于 endIndex。

在许多情况下,您始终可以创建一个子字符串,该子字符串在字符串中的一个字符之后开始。

因为endIndex可以是字符串的长度,beginIndex可以和endIndex一样大(但不能更大),所以beginIndex等于字符串的长度也是可以的.

【讨论】:

  • +1。你刚刚教会了我一些东西。 minIndex 可以等于长度。我从来没有这样做过,所以我认为这是非法的。
【解决方案3】:

在第一种情况下 (s.substring(5)),Oracle 文档说

...
IndexOutOfBoundsException - 如果 beginIndex 为负数或大于此 String 对象的长度。
...

在第二种情况下 (s.substring(5,5)),它表示

...
IndexOutOfBoundsException - 如果 beginIndex 为负数,或者 endIndex 大于此 String 对象的长度,或者 beginIndex 大于 endIndex
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多