黑马程序员技术交流社区

标题: substring使用疑问 [打印本页]

作者: lcjasas    时间: 2013-4-11 16:21
标题: substring使用疑问
本帖最后由 lcjasas 于 2013-4-11 19:41 编辑

例句“return sb.toString().substring(0,sb.toString().length());“

substring  public  substring(int start,  int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符。
参数: start - 起始索引(包含)。 end - 结束索引(不包含)。
返回: 新的字符串。
抛出: StringIndexOutOfBoundsException - 如果 start 或 end 为负数或大于 length();如果 start 大于 end。

API上说“该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符”,可是自己试验了一下,好像没有得出效果。


(修改一下帖子)

别再说什么什么异常了,我这是从API中复制出来的。知道异常会抛出StringIndexOutOfBoundsException
就没有人试一下代码,然后在回答的吗?。。。
作者: 熊永标    时间: 2013-4-11 16:43
sb.toString().substring(0,sb.toString().length());发生角标越界,因为length返回了字符串sb的长度,而字符串的角标计数是从0开始的,所以会出现角标越界,就该是
sb.toString().substring(0,sb.toString().length()-1);


作者: lyg2013    时间: 2013-4-11 17:09
substring
public String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始, endIndex:到指定的 endIndex-1处结束。
示例:
"hamburger".substring(3,8) returns "burge"
"smiles".substring(0,5) returns "smile"
参数:
beginIndex - 开始处的索引(包括)。
endindex 结尾处索引(不包括)。
返回:
指定的子字符串。
抛出:
IndexOutOfBoundsException - 如果 beginIndex 为负,或length大于字符串长度。
示例
<script type="text/javascript">
var str="Hello world!"
document.write(str.substring(1,3));
</script>
上面返回字符串:"el";
str.substring(1,2) //返回e
str.substring(1) //返回"ello world";
还有此函数中会出现奇怪的现象,当出现str.substring(5,0);
这又是怎么回事,不过返回的是"hello",
str.substring(5,1) //返回"ello",截去了第一位,返回余下的.
可见substring(start,end),可以有不同的说明,即start可以是要返回的长度,end是所要去掉的多少个字符(从首位开始).
在JS中,substr(start,length),用得较方便.
作者: 杨冉    时间: 2013-4-11 17:15
API中所说的substring(int start,  int end)这个方法里,start和end参数是指的字符串的角标,而length()方法返回的是字符串长度,而不是最后一个角标。字符串的角标是从0到str.length()-1的。
所以你这样写会产生角标越界异常,需要修改成
  1. return sb.toString().substring(0,sb.toString().length()-1);
复制代码

作者: mvplee    时间: 2013-4-11 17:23
Java1.7API中:关于sbustring抛的异常:
Throws:
IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.

作者: lcjasas    时间: 2013-4-11 19:30
熊永标 发表于 2013-4-11 16:43
sb.toString().substring(0,sb.toString().length());发生角标越界,因为length返回了字符串sb的长度,而字符 ...

无语,要是异常,我会说出来的。。。
作者: 杨永胜    时间: 2013-4-12 00:56
不知道你说的是什么问题。。
作者: wuddd    时间: 2013-4-12 07:11
“return sb.toString().substring(0,sb.toString().length());“这句话不会抛出异常,这是首先要回答的问题。

假设String sb=“ABCDE”;
那么sb.length()的值就是5,即sb.substring(0,5),开始索引是0(即字符“A”,包括这个字符),结束索引是5(在字符"E"后面,不包括)。也就是说应该包括从“A”到“E”的之间的所有字符。

在学习的时候,把索引位置0对应的是第一个字符的位置,这是关键点。

作者: lcjasas    时间: 2013-4-12 14:03
吴超老师 发表于 2013-4-12 07:11
“return sb.toString().substring(0,sb.toString().length());“这句话不会抛出异常,这是首先要回答的问 ...

谢谢老师~也就是说我也输出的如果是String sb=“ABCDE。”;
我要去掉后面的"。",就要.length()-1了。
作者: wuddd    时间: 2013-4-12 14:44
lcjasas 发表于 2013-4-12 14:03
谢谢老师~也就是说我也输出的如果是String sb=“ABCDE。”;
我要去掉后面的"。",就要.length()-1了。 ...

字符串“ABCDE。”一共有6个字符。长度是length(),等于6。如果是想输出前五个字符,那么就是sb.substring(0, sb.length()-1)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2