java字符串索引超出绑定exception

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

String name = "John"; 

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

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

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

 JOHN 0 1 2 3 

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

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

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

  JOHN ^ ^ ^ ^ ^ 0 1 2 3 4 

两个索引都必须在显示的范围内, endIndex索引必须与beginIndex相同或在右边 – 然后子字符串是两个相应边界之间的字符:

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

当然,这完全符合记录

IndexOutOfBoundsException – 如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex

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

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

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

String对象的substring(a,b)方法将索引从a返回到b-1,因此substring(3,4)只返回“N”,即只返回索引值3.注意substring(a,a)总是返回一个空字符串。

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