字符串索引超出界限错误

时间:2011-10-22 17:54:55

标签: java string recursion indexoutofboundsexception

以下代码尝试给定一个字符串,递归计算(无循环)字符串中小写“x”字符的数量。

代码出现此错误: 线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0

此代码的主要方法是:

public static void main(String [] args)
{
  System.out.println(countX("hx1x"));
}

实际代码是:

public static int countX(String str)
{ 
    if(str.charAt(0) != 'x')
    {
        if(str.indexOf('x') >= 1)
        {
            return countX(str.substring(1, str.length()));
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 1 + countX(str.substring(1, str.length()));
    }
}

4 个答案:

答案 0 :(得分:1)

添加

    if (str.length() <= 0) return 0;

在countX开始(...)

抛出异常
    if(str.charAt(0) != 'x')

当str是“”

顺便说一下。在为每个char检查创建新字符串时,代码并不完全有效。像这样的递归函数抛出StackOverflowError并输入足够长的时间。

看看这个: Java: How do I count the number of occurrences of a char in a String?

答案 1 :(得分:0)

你错过了递归的基本情况 - 如果字符串的长度为零,会发生什么?试试这个:

public static int countX(String str) {
    if (str.length() == 0)
        return 0;
    else if (str.charAt(0) == 'x')
        return 1 + countX(str.substring(1));
    else
        return countX(str.substring(1));
}

或者,您可以省略子字符串操作并传递您当前所在的索引 - 这种方式更有效,因为它避免了创建不必要的字符串对象

public static int countX(String str, int idx) {
    if (idx == str.length())
        return 0;
    else if (str.charAt(idx) == 'x')
        return 1 + countX(str, idx+1);
    else
        return countX(str, idx+1);
}

然后,你会调用这样的方法:

countX("hx1x", 0)

答案 2 :(得分:0)

为您的功能编写一组单元测试。现在,这可能像一些像

这样的行一样简单
assertEquals(2, countX("hx1x", 0));

到你的主()。从非常简单的案例开始,例如:

assertEquals(0, countX("", 0));
assertEquals(0, countX("a", 0));
assertEquals(1, countX("x", 0));

这些将更容易调试 - 如果必须,请使用调试器,但如果您的示例很简单,则可能甚至不需要。

答案 3 :(得分:0)

为什么要做一些简单的事情会让它变得如此复杂?这是一个更简单的问题解决方案:

    int count=0;
    for(int i = 0; i< str.length(); i++){
        if(str.charAt(i) == 'x') count++;
    }