2013-03-13 65 views
2

我有这个字符串:得到一个字符

String code="abc"; 

我想substring方法提取的“C”从这个字符串,但它不工作:

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

此代码返回一个错误

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

但我不知道为什么?

回答

14

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

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

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

还要注意的是,如果你只是想获得最后一个字符,你可以只使用单参数过载,从返回一个字符串给定起点到字符串的结尾:

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

或者你可以把它作为一个单一的字符:

char lastCharacter = text.charAt(text.length() - 1); 
+0

当然,你是第一个) – bsiamionau 2013-03-13 15:33:02

+0

@乔恩飞碟双向!但是当我这样做:substring(2,1);我没有得到任何东西! – Fcoder 2013-03-13 15:33:15

+3

@FarhadShirzad:不,你会得到一个异常......如果你使用'substring(2,3)',你会得到最后一个字符。 – 2013-03-13 15:33:37

7

第二个参数不是长度,它是an end index

String#substring(int beginIndex, int endIndex) 
0

的从0开始的索引,您可以尝试

String code="abc"; 
String getsmscode=code.substring(2); 
+0

这不会提取最后一个字符。 OP刚刚误解了第二个参数。 – 2013-03-13 15:34:21

0

我觉得子需要开始索引或开始索引和结束索引作为参数:

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

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

+1

交换1和2将返回b。结束索引字符被排除。 – 2013-03-13 15:37:37

+0

是的。我更加反应了人们缺乏对功能预期的参数的理解,而不是提供一个确切的解决方案。道歉,下次我会遵守规则。 – 2013-03-13 19:06:31

0

使用也可以达到这个效果。

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

方法描述

public String substring (int start, int end) 

返回包含的字符从该字符串的子序列的字符串。返回的字符串共享此字符串的后备数组。

参数

开始 - 偏移量的第一个字符。

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

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

抛出

3

以上家伙已经充分回答了你的问题,但只是在阅读API的一些技巧。

方法通常以public一词开始,然后包含返回类型......这是什么类型的数据将被返回。如果预计没有任何回报是无效的。

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

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

这个特殊的方法它接受两个整数。这些帮助保持一个索引,你想保持多少字符串

索引是一个重要的概念,要理解,很难描述它是如何工作的话,但看在api描述列表帮助中的例子帮助。

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

重要的是要注意api提及排除和包括在参数说明中。这只是表示返回的字符串将包含由第一个参数索引的字母,但不包括由第二个参数索引的字母。

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

stringName.substring(stringName.length()-1); 
+1

感谢你的完美单词......谢谢。我解决了我的问题 – Fcoder 2013-03-13 18:41:37