java字符串索引超出绑定异常

时间:2015-01-30 14:23:08

标签: java

这似乎是一个简单的问题,但我想知道为什么我有这样的String变量:

String name = "John";

然后我正在使用这样的子串方法:

System.out.print(name.substring(3,4));

它工作正常,但如果我将5改为5或更高,我得到IndexOutOfBoundsException。但正如我理解索引更正,也没有4索引,但outpul将是"n"

J O H N
0 1 2 3 

有人可以解释这种行为吗?提前谢谢!

4 个答案:

答案 0 :(得分:7)

substring的第二个参数是独占上限 - 因此允许它等于字符串的长度,以便包含最后一个字符。同样,允许起始点“在”字符串的末尾是有意义的,只要结尾等于开始,就会产生一个空字符串。

基本上,对于处理范围的API,将索引视为“在”字符之间而不是“在”它们之间通常是有意义的。例如:

  J O H N
 ^ ^ ^ ^ ^
 0 1 2 3 4

两个索引必须在显示的范围内,并且endIndex索引必须与beginIndex相同或在右边 - 然后子字符串是两个相应边界之间的字符:< / p>

"JOHN".substring(1, 3) is "OH"

  J O H N
   ^ ^ ^
   1   3

这正是documented,当然是

  

IndexOutOfBoundsException - 如果beginIndex为否定,或endIndex大于此String对象的长度,或beginIndex大于endIndex

答案 1 :(得分:1)

来自http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int,%20int)

  

如果beginIndex为负数,则抛出IndexOutOfBoundsException,或    endIndex大于此String对象的长度,或   beginIndex大于endIndex。

你的字符串长度是4,所以4可以,但5或更多就是KO。

答案 2 :(得分:0)

String对象的

substring(a,b)方法返回substring 从索引 a到b-1 所以substring(3,4)只返回“N”,即只返回索引值3。 请注意,substring(a,a)始终返回空字符串。

答案 3 :(得分:0)

我认为你错误地理解这一点,因为“没有4个索引,但是outpul将是”n“”,子串方法从1开始计数(而不是从0开始),所以你的第一个例子没有任何问题因为第四个角色原本是n。