2

我有这个字符串:

String code="abc";

我想通过substring方法从这个字符串中提取“c”,但它不起作用:

String code="abc";
String getsmscode=code.substring(2,1);

此代码返回错误

java.lang.StringIndexOutOfBoundsException: length=3; regionStart=2; regionLength=-1

但我不知道为什么?

4

6 回答 6

14

您需要阅读substring 的文档- 第二个参数不是长度,它是结束索引(不包括)。

参数:
beginIndex - 开始索引,包括在内。
endIndex- 结束索引,独占。

如有疑问,请阅读文档...

另请注意,如果您只是想获取最后一个字符,则可以只使用单参数重载,它会返回从给定起点到字符串结尾的子字符串:

String lastCharacter = text.substring(text.length() - 1);

或者您可以将其作为单个字符获取:

char lastCharacter = text.charAt(text.length() - 1);
于 2013-03-13T15:31:17.893 回答
7

第二个参数不是长度,它是结束索引

  String#substring(int beginIndex, int endIndex) 
于 2013-03-13T15:31:11.630 回答
3

上面的人已经充分回答了你的问题,但只是一些关于阅读 API 的提示。

方法通常以单词 public 开头,然后包括返回类型......这就是将返回的数据类型。如果没有任何预期返回是无效的。

然后是方法的名称和两个括号。

括号之间是它接受的参数类型。

使用这种特殊方法,它接受两个整数。这些有助于保留您想要保留多少字符串的索引

索引是一个需要理解的重要概念,很难用语言描述它是如何工作的,但查看 api 描述列表中的示例会有所帮助。

index-1 通常表示从 0 开始计数,因此在字符串“Hello World”中,H 的索引为 0,d 的索引为 10。请注意,只有 9 个字母,但我们仍然必须将空格作为字符包含在内,因此在这种情况下它的索引是5.

重要的是要注意 api 提到的参数描述中排除和包含。这只是意味着返回的字符串将包含由第一个参数索引的字母,但不包含由第二个参数索引的字母。

如果您需要做的就是提取字符串中的最后一个字母,无论字符串大小有多长,一个简单的解决方案是

stringName.substring(stringName.length()-1); 
于 2013-03-13T16:00:12.070 回答
0

索引从0开始。你可以试试

String code="abc";
String getsmscode=code.substring(2);
于 2013-03-13T15:31:27.437 回答
0

我认为 substring 需要一个开始索引或一个开始索引和结束索引作为参数:

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

你给它一个大于结束索引的开始索引,因此它会变得混乱,因为返回的长度是负数。交换 1 和 2。

于 2013-03-13T15:32:47.367 回答
0

使用也可以做到这一点。

String getsmscode = code.substring(2,3);

方法说明

public String substring (int start, int end)

返回一个字符串,该字符串包含来自该字符串的字符子序列。返回的字符串共享此字符串的支持数组。

参数

start - 第一个字符的偏移量。

end- 最后一个字符的偏移量。

返回一个包含从开始到结束的字符的新字符串 - 1

投掷

IndexOutOfBoundsException   if start < 0, start > end or end > length(). 
于 2013-03-13T15:38:54.517 回答