子串奇怪的边界?

时间:2015-02-26 07:17:44

标签: java string substring indexoutofboundsexception

所以,我试图弄清楚为什么String.substring(int startIndex)允许一个超出范围的起始索引并且不抛出OOB异常?

以下是我用以下代码测试的代码:

public class testSub {
public static void main(String[] args) {
    String testString = "D";
    String newSub= testString.substring(1); //print everything FROM this index Up, right? Should that not be out of bounds? Yet I just get a blank.
    System.out.println(newSub); //this works fine and prints a blank
    System.out.println(testString.charAt(1));  // <Yet this throws OOB?
    System.out.println(testString.lastIndexOf("")); // Gives me (1) but I just tried getting it? Should this not mean String length is 2?
    }
}

我理解子串是子串(包含,独占),但是1明显超出范围,所以为什么它给出一个空格而不是抛出OOB,或者它是如何做的呢? “”是一些特例吗?

6 个答案:

答案 0 :(得分:3)

根据JavaDoc,substring方法只会在index为&gt;时抛出异常。字符串对象的长度。 仅当index不比对象的长度少时,chart方法才会抛出异常。

子串方法(int beginIndex)

参数:     beginIndex起始索引,包括。 返回:      指定的子字符串。 抛出:     IndexOutOfBoundsException - 如果beginIndex为负或大于此String的长度

ChartAT方法

返回指定索引处的char值。一个索引  范围从0到length() - 1.第一个char值  sequence位于索引0,下一个位于索引1,依此类推,  至于数组索引。 如果索引指定的char值是代理项,  返回代理值。 指定者:CharSequence中的charAt(...) 参数:     索引char值的索引。 返回:      此字符串的指定索引处的char值。       第一个char值位于索引0处。 抛出:     IndexOutOfBoundsException - 如果索引      参数是否定的或不小于此的长度      串。      对象

答案 1 :(得分:1)

正如文件所说:

 * IndexOutOfBoundsException  if
 *             <code>beginIndex</code> is negative or larger than the
 *             length of this <code>String</code> object.

仅当beginIndex更大时,length才会抛出IndexOutOfBoundsException。在你的情况下,两个值都是等于。

答案 2 :(得分:1)

查看String.substring(int beginIndex)的Javadoc,了解它何时抛出IndexOutOfBoundsException

  

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

由于字符串长度为1而你用1来调用它,所以你没有得到IndexOutOfBoundsException

答案 3 :(得分:1)

好的,人们一直在抛弃java doc,但这并没有真正回答这个问题。

你可以做"D".substring(1)的原因是因为你要求从索引1开始到索引1(不包括)的字符串。根据定义,这是空字符串,因为它的大小为1-1 = 0。每个字符串在开头,结尾和每个字符之间都有一个空字符串。例如。 "" + "B" + "O" + "" + "B" + "" = "BOB"

答案 4 :(得分:0)

由于您的字符串长度为1且String由char数组支持,因此您只需将char[0]填充D作为值(注意数组索引从0开始而不是1)。现在,您尝试使用charAt方法从字符串(间接字符数组)访问第一个索引,如:

System.out.println(testString.charAt(1));

因此你得到100个例外。

如果要从字符串中访问第一个字符,则应使用:

System.out.println(testString.charAt(0));

答案 5 :(得分:0)

Marcio说。另外:方法lastIndexOf不是您的想法。它是this中参数substring的最后一个索引。对于空字符串参数,它总是长度加一!