-3

我收到此错误:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:7

而且我不知道是什么导致了越界异常。这是我的代码:

public class LuckySeven {
    public int luckySevens(String input, int index, int sevens) {
        int curDigit = input.charAt(index) - 48;
        if (curDigit == 7) {
            if (index > 0 && (int) input.charAt(index - 1) - 48 == 7) {
                sevens += 14;
            }
            else sevens++;
        }
        if (index < input.length()) {
            luckySevens(input, index+1, sevens);
        }
        return sevens;
    }
}

我只是在运行 luckySevens("1087171", 0, 0) 但它在尝试重复时会不断中断。这是错误消息:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 7
    at java.lang.String.charAt(String.java:658)
    at LuckySeven.luckySevens(LuckySeven.java:6)
    at LuckySeven.luckySevens(LuckySeven.java:14)
    at LuckySeven.luckySevens(LuckySeven.java:14)
    at LuckySeven.luckySevens(LuckySeven.java:14)
    at LuckySeven.luckySevens(LuckySeven.java:14)
    at LuckySeven.luckySevens(LuckySeven.java:14)
    at LuckySeven.luckySevens(LuckySeven.java:14)
    at LuckySeven.luckySevens(LuckySeven.java:14)
    at Tester.main(Tester.java:7)

我真的很感激任何帮助!我觉得这是我没有抓住的一些愚蠢的东西。谢谢!

4

2 回答 2

0

首先查看抛出的异常,

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 7
    at java.lang.String.charAt(String.java:658)

String index out of range : 7表示您正在请求索引 7 并且超出范围。由于您的字符串1087171长度为 7 个字符,因此它只有索引 0-6 (0, 1, 2, 3, 4, 5, 6); 没有第 7 个索引。

如果我们继续查看异常的其余部分,我们可以进一步确定发生了什么:

at LuckySeven.luckySevens(LuckySeven.java:6)
at LuckySeven.luckySevens(LuckySeven.java:14)
at LuckySeven.luckySevens(LuckySeven.java:14)
at LuckySeven.luckySevens(LuckySeven.java:14)
at LuckySeven.luckySevens(LuckySeven.java:14)
at LuckySeven.luckySevens(LuckySeven.java:14)
at LuckySeven.luckySevens(LuckySeven.java:14)
at LuckySeven.luckySevens(LuckySeven.java:14)

该行at LuckySeven.luckySevens(LuckySeven.java:6)是导致错误被抛出的表达式。在这种情况下,它是int curDigit = input.charAt(index) - 48;。接下来的 7 行at LuckySeven.luckySevens(LuckySeven.java:14)是字符串前 7 个字符的递归方法调用。所以我们可以看出它通过了前 7 个字符,但随后第 8 次调用了 luckySevens 方法。

正如另一个用户已经发布的那样,更改块

    if (index < input.length()) {
        luckySevens(input, index+1, sevens);
    }

    if (index < input.length()-1) {
        luckySevens(input, index+1, sevens);
    }

它将在第 7 个字符处停止。

于 2018-04-02T04:45:31.757 回答
0

您的代码的问题在于您正在引用int curDigit = input.charAt(index) - 48;,而您的 if 语句正在使用 input.length()。

我的意思是说字符串“hello”被传递到你的函数中。String.length()返回函数的长度,在本例中为 5。在倒数第二个循环中,索引将等于 4,并且函数将再次运行,索引等于 4+1,即 5。

但是因为input[5]会尝试引用不存在的字符串的第六个字符,所以会出现字符串 IoB 错误。

要解决此问题,请尝试更换

if (index < input.length()) {
    luckySevens(input, index+1, sevens);
}

if(index < input.length() - 1) {
    luckySevens(input, index+1, sevens)l
}

或考虑改用 for 循环。希望这会有所帮助:D

于 2018-04-02T04:40:00.027 回答