问题描述
我正在尝试从字符串中获取子字符串。我编写了提供开始索引和结束索引的逻辑,但低于异常。 代码是:
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
。
这不是一个确切的答案或更正,因为我认为您的方法需要改变。我建议使用基于正则表达式的方法来查找文本正文中的所有键值对。考虑这个版本:
String input = "<html> <head></head> <body> Sent: Thu Feb 04 19:06:38 IST 2021 From: test@test.com To: tester1@test.com,tester2@test.com Subject:";
String pattern = "\\b(\\S+): (.*?)(?= \\S+:)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);
while (m.find()) {
System.out.println("Found: (" + m.group(1) + "," + m.group(2) + ")");
}
打印:
Found: (Sent,Thu Feb 04)
Found: (From,test@test.com)
Found: (To,tester1@test.com,tester2@test.com)
您可以遍历文本并搜索您需要的任何键/值。在这种情况下避免子串操作,因为它留下了太多的边缘情况。