字符串子串索引可以是字符串的长度。

7
这是一个Java字符串问题。我使用substring(beginindex)方法来获取子串。考虑到String s="hello",这个字符串的长度为5。然而,当我使用s.substring(5)或者s.substring(5,5)时,编译器没有报错。字符串的索引应该从0到length-1。为什么这种情况不适用于我的代码?我认为s.substring(5)应该会报错,但实际上并没有。

s.substring(s.length()) 是愚蠢但有效的。 - user180100
4
不要依赖直觉。阅读javadocs。它们说不应该出错,即使使用s.substring(5)。 - Stephen C
3个回答

9
因为在文档中指定endIndex是排他的。

如果beginIndex为负数,或endIndex大于此字符串对象的长度,或beginIndex大于endIndex,则抛出IndexOutOfBoundsException异常。


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

为什么呢?

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

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

如果您查看源代码

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
@user3382017 的 s.substring(5); 等同于 s.substring(5, s.length());,对于字符串 "Hello" 来说则为 s.substring(5,5); - Alexis C.

6
由于substring的定义,您可以在String.substring的Javadoc中找到它。

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

在许多情况下,您可以始终创建一个以字符串中某个字符之后开始的子字符串,这是非常有用的。
由于endIndex可以是字符串的长度,而beginIndex可以与endIndex一样大(但不能更大),因此beginIndex等于字符串的长度也是可以的。

1
+1。你刚刚教会了我一些东西。minIndex可以等于length。我从来没有这样做过,所以我以为这是不合法的。 - aliteralmind

1
在第一种情况下(s.substring(5)),Oracle文档表示:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接