为什么以下异常显示 -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);
}

您可以看到,如果 -1beginIndex,您将在错误消息中得到 -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)

您可以遍历文本并搜索您需要的任何键/值。在这种情况下避免子串操作,因为它留下了太多的边缘情况。