所以,我试图弄清楚为什么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,或者它是如何做的呢? “”是一些特例吗?
答案 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的最后一个索引。对于空字符串参数,它总是长度加一!