这似乎是一个简单的问题,但我想知道为什么我有这样的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
有人可以解释这种行为吗?提前谢谢!
答案 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)
substring(a,b)方法返回substring 从索引 a到b-1 所以substring(3,4)只返回“N”,即只返回索引值3。 请注意,substring(a,a)始终返回空字符串。
答案 3 :(得分:0)
我认为你错误地理解这一点,因为“没有4个索引,但是outpul将是”n“”,子串方法从1开始计数(而不是从0开始),所以你的第一个例子没有任何问题因为第四个角色原本是n。