这是一个Java字符串问题。我使用substring(beginindex)
来获取子字符串。 考虑到String s="hello"
,该字符串的长度是5.但是,当我使用s.substring(5)
或s.substring(5,5)
编译器没有给我一个错误。字符串的索引应该从0到length-1。 为什么它不适用于我的情况?我认为s.substring(5)
应该给我一个错误,但它不会。字符串子字符串索引可能是字符串的长度
回答
因为endIndex
是排他性的,如documentation中所述。
IndexOutOfBoundsException - 如果将beginIndex为负,或者endIndex的 比该字符串对象的长度大,或beginIndex 大于endIndex。
当我用s.substring(5)我想,这应该给我的错误,而它 没有
为什么它会是什么?
返回一个新字符串,该字符串是该字符串的子字符串。子字符串 以指定索引处的字符开头,并扩展到该字符串的 结尾。
由于beginIndex
是(你的情况5)比endIndex
没有较大的,这是完全有效的。你只会得到一个空字符串。
如果你看一下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,5);
。
当你调用s.substring(5,5);
,它返回一个空字符串,因为你调用构造函数(这是私人包)为0的count
值(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());'s.substring(5) ,5);'为“你好”。 –
因为substring
被定义为这样的,你可以在the Javadoc of String.substring
抛出IndexOutOfBoundsException异常发现,如果将beginIndex为负, 或endIndex是大于此String对象的长度或 beginIndex大于endIndex。
这是非常有用在许多情况下,你总是可以创建一个在一个字符串的字符之后开始一子。
由于endIndex
可以是串的长度,及beginIndex
可以大如endIndex
(但不大于),它也还可以用于beginIndex
为等于该字符串的长度。
+1。你刚刚教了我一些东西。 minIndex可以等于长度。我从来没有做过,所以我认为这是非法的。 – aliteralmind
在第一种情况下(s.substring(5)
)中,Oracle的文档说
...
IndexOutOfBoundsException - 如果的beginIndex为负或大于这个字符串对象的长度大。
...
在第二种情况下(s.substring(5,5)
),它说,
...
IndexOutOfBoundsException - 如果的beginIndex为负,或者endIndex大的长度大此String对象或beginIndex大于endIndex
...
- 1. 从字符串中提取可变长度的子字符串
- 2. 从字符串中间拉取可变长度子字符串
- 3. 字符串的长度比字符串的长度长
- 4. 字符串索引必须是整数 - 子字符串
- 5. hw搜索索引字符串列表中的子字符串?
- 6. Awk--将字符串分成长度为n的子字符串
- 7. 从任意长度的字符串中提取子字符串
- 8. 查找字符串中所有子字符串的长度
- 9. 在指定长度的子字符串中拆分字符串
- 10. 只有字符串长度大于2的子字符串
- 11. 如何打印出字符串索引字符串中字符串的字符
- 12. 子索引成字符串
- 13. 字符串拆分/字符串替换基于字符长度
- 14. 可变长度TSQL子字符串
- 15. 查找字符串中的所有3个字符长度的子字符串
- 16. SQL子字符串使用charindex - somelength或字符串长度 - somelength
- 17. DBReader提供字符串的长度而不是字符串
- 18. 索引字符串?
- 19. 字符串索引
- 20. 索引字符串
- 21. 的Perl:字符串中子字符串或子字符串中
- 22. 查找字符串中子字符串的所有索引
- 23. Noob,创建字符串方法的索引和子字符串
- 24. C#中的字符串性能 - 什么是更快地比较,字符串文字或字符串长度
- 25. 如何检索在字符串中具有可变长度的字符的子字符串?
- 26. 作为字符的索引字符串
- 27. bash的字符串长度
- 28. 字符串的长度(Python)
- 29. JQ不能索引字符串字符串“值”
- 30. 长字符串
's.substrin g(s.length())'是愚蠢但是有效的 – 2014-03-29 11:17:37
*“我认为当我使用s.substring(5)时,它应该给我错误,而不是”* - 不要依靠你的直觉。阅读javadocs。他们说不应该。 –