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

use*_*623 1 java

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

String name = "John";
Run Code Online (Sandbox Code Playgroud)

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

System.out.print(name.substring(3,4));
Run Code Online (Sandbox Code Playgroud)

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

J O H N
0 1 2 3 
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

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

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

  J O H N
 ^ ^ ^ ^ ^
 0 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

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

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

  J O H N
   ^ ^ ^
   1   3
Run Code Online (Sandbox Code Playgroud)

当然,这完全符合记录

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