-1

我编写了下面的代码来co_e在下面的字符串中找到一个关键字,其中_代表任何其他字符。

如果我将字符串更改为"aaacodebbb"or"codexxcode" 但如果我将其更改为"xxcozeyycop"它会抛出StringIndexOutOfBoundsException

public int countCode(String str) {
    int count = 0;
    String result = "";
    boolean yes = true;
    for (int i = 0; i < str.length(); i++) {
        // yes = str.charAt(i+3);
        if (str.length() >= 3) {
            if (str.charAt(i) == 'c' && str.charAt(i + 1) == 'o' && str.charAt(i + 3) == 'e')
                count++;
        }
    }
    return (count);
}
4

2 回答 2

1

您的越界错误发生在这一行:

if (str.charAt(i) == 'c' && str.charAt(i + 1) == 'o' && str.charAt(i + 3) == 'e')

错误发生在str.charAt(8)for str = "xxcozeyycop",因为str.length()是 11,并且str.charAt(11)显然超出了界限(所有 都如此str.charAt(str.length())

这是一种可能的解决方案。请注意,如果str.length() < 4,for 循环无法运行,因为它i + 3总是会超出范围。此外,当i == str.length() - 4对于所有长度超过四个字符i+3的字符串时,将等于字符串的最后一个索引str.length() - 1.

for (int i = 0; i < str.length() - 3; i++) {
    char c1 = str.charAt(i);
    char c2 = str.charAt(i + 1);
    char c4 = str.charAt(i + 3);

    if (c1 == 'c' && c2 == 'o' && c4 == 'e')
        count++;
}
于 2018-04-14T06:07:57.173 回答
0

在循环中,您正在检查访问 i+3。因此,您必须在倒数第 4 位时停止i

替换if(str.length()>= 3)if(str.length()>= 3 && str.length() - i >3)

或者

您可以将以下内容作为 for 循环中的第一个条件:

if(str.length() - i <=3){
    break;
}
于 2018-04-14T05:48:34.507 回答