Java 为什么这不是StringIndexOutOfBounds? publicstringdeldeldel(stringstr){ 如果(str.length()String constructor->Arrays.copyOfRange分支。这应该会有所帮助。我将把它留给一些更好的响应者,以便在回答中很好地格式化它。 String str = "Hello"; String a = str.substring(2, 4); // a is "ll" (not "llo") String b = str.substring(0, 3); // b is "Hel" String c = str.substring(4, 5); // c is "o" -- the last char
如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()不在范围内?下面的代码是string类的substring方法在java中的实现:Java 为什么这不是StringIndexOutOfBounds? publicstringdeldeldel(stringstr){ 如果(str.length()String constructor->Arrays.copyOfRange分支。这应该会有所帮助。我将把它留给一些更好的响应者,以便在回答中很好地格式化它。 String str = "Hello"; String a = str.substring(2, 4); // a is "ll" (not "llo") String b = str.substring(0, 3); // b is "Hel" String c = str.substring(4, 5); // c is "o" -- the last char,java,Java,如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()不在范围内?下面的代码是string类的substring方法在java中的实现: public String delDel(String str) { if (str.length() < 4) return str; if (str.substring(1,4).equals("del"))
public String delDel(String str) {
if (str.length() < 4)
return str;
if (str.substring(1,4).equals("del"))
return str.substring(0, 1) + str.substring(4, str.length());
else
return str;
}
公共字符串子字符串(int-beginIndex,int-endIndex){
如果(beginIndex<0){
抛出新的StringIndexOutOfBoundsException(beginIndex);
}
if(endIndex>value.length){
抛出新的StringIndexOutOfBoundsException(endIndex);
}
int SUBELN=endIndex-beginIndex;
如果(子项<0){
抛出新StringIndexOutOfBoundsException(SubCN);
}
返回((beginIndex==0)和(&(endIndex==value.length))?此
:新字符串(值、beginIndex、子项);
}
可以看出,beginIndex仅被检查为不小于零,endIndex仅被检查为字符串的“value.length”大于它。然后,如果此条件通过,则请求的子字符串将由以下代码创建:
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}
公共字符串(字符值[],整数偏移量,整数计数){
如果(偏移量<0){
抛出新StringIndexOutOfBoundsException(偏移量);
}
如果(计数>1)。
如果(偏移量>value.length-计数){
抛出新StringIndexOutOfBoundsException(偏移量+计数);
}
this.value=Arrays.copyOfRange(值、偏移量、偏移量+计数);
}
在您的例子中,因为计数将变为零(4-4),所以“this.value=”“.value;”有一个更复杂的substring()版本,它同时接受开始和结束索引号:substring(int start,int end)返回一个从开始索引号开始的字符字符串,一直到结束索引,但不包括结束索引
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count <= 0) {
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
if (offset <= value.length) {
this.value = "".value;
return;
}
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
上面的c示例使用子字符串(4,5)获取最后一个字符
比最后一个字符的索引多一个。但是,这并不正确
超出范围,因为子字符串()“最多但不包括”使用
顺便说一句,结果子字符串的长度
总是可以通过减法(结束-开始)来计算——用
上面的例子
同样的原因是
”。子字符串(0,0)
并没有超出范围。所以索引号可以与字符串长度相同,但什么也不显示?这是由javadoc为string::substring
方法解释的。谷歌为“javadoc字符串”搜索。您可以进入String类的源代码,找到substring方法并跟踪程序流。从那里开始,它将从substring->String constructor->Arrays.copyOfRange分支。这应该会有所帮助。我将把它留给一些更好的响应者,以便在回答中很好地格式化它。
String str = "Hello";
String a = str.substring(2, 4); // a is "ll" (not "llo")
String b = str.substring(0, 3); // b is "Hel"
String c = str.substring(4, 5); // c is "o" -- the last char