为什么以下异常显示-4索引而不是-1?
我正在尝试从字符串中获取子字符串。我编写了提供开始索引和结束索引的逻辑,但低于异常。代码是:
final int startIndex = header.indexOf(startValue + ":")
+ (startValue + ":").length();
final int endIndex = header.indexOf(endValue + ":");
return header.substring(startIndex, endIndex).trim();
例外:
'字符串索引超出范围:-4' java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-4 在 java.lang.String.substring(String.java:1967)
任何帮助,将不胜感激。
回答
的相关代码substring为:
1965 int subLen = endIndex - beginIndex;
1966 if (subLen < 0) {
1967 throw new StringIndexOutOfBoundsException(subLen);
1968 }
如果您-4在异常消息中看到,这意味着endIndex - beginIndex == -4.
显然,endIndex应该大于或等于beginIndex,这样差异就不会是负数。
查看完整方法(此版本的代码似乎与您的版本匹配,基于行号 - 1967 - 其中抛出异常):
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);
}
你可以看到-1如果beginIndex是,你会得到错误消息-1。
但是如果beginIndex是非负数,并且endIndex不是太大,则您在异常消息中得到的数字是endIndex - beginIndex。