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 为什么这不是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"))

如果我运行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"))
  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