找不到出界错误的原因

时间:2018-04-02 04:31:49

标签: java stringindexoutofbounds

我收到此错误: 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)

我真的很感激任何帮助!我觉得这是一些我没有抓到的蠢事。谢谢!

2 个答案:

答案 0 :(得分:0)

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

我的意思是,将字符串“hello”传递给您的函数。 String.length()返回函数的长度,在这种情况下为5.在倒数第二个循环中,index将等于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

答案 1 :(得分: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个角色。