2016-02-26 71 views
0

的假设我有一个Java的String索引越界混淆

String temp = "abcd"; 

System.out.println(temp.substring(0,4)); // out of bound, no error 
System.out.println(temp.substring(0,5)); // out of bound, error 

为什么?

+0

的第二个参数是endIndex的,但最后指数是3 – KKKK

+0

没必要重复,但是这可能会感兴趣:http://stackoverflow.com/a/33600969/1393766 – Pshemo

回答

3

Javadocs for this method状态:

的串开始在指定的beginIndex和延伸到字符索引endIndex - 1的

抛出:

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

结束索引length可以,但length + 1不是。

+0

如果键入的System.out.println(TEMP .substring(4,4));为什么-1没有出现? – KKKK

+0

@KKKK为什么会出现'-1'?这应该打印一个空字符串,这将不可见。 – rgettman

0

因为子字符串在endIndex-1处结束。

1

根据docs

public String substring(int beginIndex, int endIndex)

的串开始在指定的beginIndex并延伸到字符索引endIndex - 1

IndexOutOfBoundsException - 如果beginIndex为负,或者endIndex比该字符串对象的长度大,或beginIndexendIndex大。

由于System.out.println(temp.substring(0,5));其中5>字符串的长度(abcd),因此是例外。

0

子串(0,4)不考虑0到4.它认为0到3.第二个索引总是减1.在你的第二种情况下temp [4]超出范围。