【问题标题】:String Index Out of Bounds Error字符串索引越界错误
【发布时间】:2011-12-13 06:34:18
【问题描述】:

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

代码有这个错误: 线程“主”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()));
    }
}

【问题讨论】:

  • 使用 println 语句来调试你的代码。他们会告诉你你做错了什么。
  • 这就是半脑递归所发生的事情......以一个空字符串结束,调试器是一个可爱的工具,顺便说一句

标签: java string recursion indexoutofboundsexception


【解决方案1】:

只需添加

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

countX(...) 开始处

异常被抛出

    if(str.charAt(0) != 'x')

当str为“”时

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

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

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      【解决方案3】:

      为您的函数编写一组单元测试。现在,这可能就像一些行一样简单

      assertEquals(2, countX("hx1x", 0));
      

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

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

      这些将更容易调试 - 如果必须使用调试器,但如果您的示例像这些一样简单,则可能甚至没有必要。

      【讨论】:

        【解决方案4】:

        既然可以做一些简单的事情,为什么要把事情搞得这么复杂?这是一个更简单的解决您的问题的方法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-01
          • 2012-12-01
          • 2012-10-03
          • 1970-01-01
          • 2012-01-18
          • 2014-06-06
          • 2015-03-22
          相关资源
          最近更新 更多