1

每次出现此子字符串时,我都想从字符串缓冲区中删除一个子字符串,到目前为止我所做的是:

  public static void main(String[] args) {

        String text = "Alice Bob Alice Bob Alice Bob";
        String substr = "Alice";            
        StringBuffer strbuf = new StringBuffer(text);
        strbuf.indexOf(substr);
        strbuf.lastIndexOf(substr);
        while (strbuf != null) {
                strbuf.delete(strbuf.indexOf(substr), strbuf.indexOf(substr) + substr.length());
                System.out.println(strbuf.toString());
            }
}

我想删除每次出现的“爱丽丝”。但它给出了以下错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

我认为是 while 行中的错误。有任何想法吗?

4

5 回答 5

3

你的问题是你试图删除一个不存在的子字符串(在你删除它的所有实例之后)。您必须将循环边界更改为类似

while(strbuf != null && strbuf.indexOf(substr) != -1)
于 2012-04-12T19:29:59.270 回答
2

因为如果text不包含substr返回indexOf-1而您调用deletewith -1

然后你的循环一直持续到strbufis != null:那是永远的

substr在您的情况下,当您删除所有事件并且下一个indexOf返回时,它会引发异常-1

以这种方式改变你的循环

int i;
while ((i = strbuf.indexOf(substr)) != -1)
    strbuf.delete(i, i + substr.length());
于 2012-04-12T19:29:38.397 回答
1

您应该检查子字符串是否是您的字符串的一部分

int pos = strbuf.indexOf(substr);
if (pos < 0) { // not found...

这永远不会是错误的,使循环无穷无尽

while (strbuf != null) { ...

更好的版本应该是

    String text = "Alice Bob Alice Bob Alice Bob";
    String substr = "Alice";            
    StringBuffer strbuf = new StringBuffer(text);
    while (true) {
      int pos = strbuf.indexOf(substr);
      if (pos < 0) break; // ready
      strbuf.delete(pos, pos + substr.length());
      System.out.println(strbuf.toString());
    }
于 2012-04-12T19:29:54.327 回答
0

您得到 -1 因为不再找到该字符串,您需要更改条件以检查您是否首先找到该字符串,然后尝试将其删除

于 2012-04-12T19:30:06.083 回答
0

这是因为一旦您从字符串缓冲区中删除字符串“Alice”,您将无法再次找到它!因此,您的 indexOf() 方法将返回 -1,因此您将获得 java.lang.StringIndexOutOfBoundsException

于 2012-04-12T19:33:56.590 回答