Search()StringIndexOutOfBoundsException

时间:2017-05-02 09:03:33

标签: java

我在一个问题中被问到要创建一个名为search的静态 递归 方法,该方法会搜索字符串中的字符,如果找到它则会打印出来的字符串' s位置,如果它没有,则返回-1

这是我的代码

public static int search(String s , char c)
{
    boolean flag = true;
    if (flag == false && s.length() == 0)
        return -(s.length() + 1);
    else
        if (s.charAt(0) == c)
        {
            return 1;
        }
        else
        {
            flag = false;
            return 1 + search(s.substring(1) , c);
        }

我使用一个标志来查看它是否在经过所有字符串后找不到它,它会预先形成所有字符串的长度减去字符串'长度 - 1, 但我总是最终得到一个" StringIndexOutOfBoundsException "错误。错误位于哪里?提前致谢! :d

编辑:如果我输入字符串中存在的字符,如动物中的 n ,但是如果我输入 o 并且字符串是动物,它会给我错误。

编辑2:我通过删除标志并遍历最后一个字符中的字符串来完成工作,谢谢大家! :d

6 个答案:

答案 0 :(得分:0)

我猜第一个索引超出界限会发生在else block s.substring(1)......

ex:s="a", c="b"

  
      
  1. flag=true
  2.   
  3. 如果(flag == false && s.length() == 0)这将失败并转到else块
  4.   
  5. in else block if (s.charAt(0) == c),此处“a”==“c”无法转到else块
  6.   
  7. 在内部的else块中,你有return 1 + search(s.substring(1) , c);这一行将查找String索引   位置1,不可用并抛出   的StringIndexOutOfBoundsException
  8.   

答案 1 :(得分:0)

由于您的递归flag始终为true,因此您的第一个if永远不会是true

如果flag成为班级成员,那将会有所帮助。在这种情况下,您需要在每次搜索之前重置flag

但如果用空字符串调用搜索,它也会导致异常。所以我认为你不需要flag

答案 2 :(得分:0)

您的代码几乎没有小问题。 flag始终为true,因此如果条件始终为false:

boolean flag = true;
    if (flag == false && s.length() == 0) // always false, even if 
// s.length() is 0

为什么需要这个flag变量?顺便说一下,此作业flag = false;无效。您需要更改搜索方法search(String s , char c, boolean flag)的签名并将其作为第3个参数传递,或者可能完全删除flag。 第二件事是你的函数将返回所有字符串的正结果,长度超过2个字符。 return 1 + search(s.substring(1) , c);return -(s.length() + 1);。只有当字符串中没有其他字符时才会执行最后一个条件(假设我们没有使用flag变量)。

if (s.length() == 0) // there are no more characters in the str
     return -(s.length() + 1); // we return -1

但在这种情况下,我们已经return 1 + search(s.substring(1) , c);,这将导致1 + -(0+1)。对于search("a",'d')1 + 1 -(0+1) search("ab",'d')等等。

我希望这会有所帮助。

答案 3 :(得分:0)

如果你想从字符串的末尾开始搜索,你可以这样做:

public static int search(String s , char c) {      
if (s==null || s.length() == 0)
return -1;
else if (s.charAt(s.length()-1) == c)
{
return s.length();
} else {
int pos=search(s.substring(0,s.length()-1) , c);
return pos;
}
}

答案 4 :(得分:0)

错误来自return 1 + search(s.substring(1) , c);这一行。

如果您要搜索'o',则在上一次迭代中 s = l 并且 s.substring(1)不会存在

答案 5 :(得分:0)

您必须移出方法外的flag变量,因为每次递归调用都会将其设置为true,因此第一个if块将永远不会被执行。 loopCount将满足您的目的,您不需要使用标志变量。

    static int loopCount =0;
    public static void main( String[] args )
    {
        System.out.println(search("animal", 'o'));
    }

    public static int search(String s , char c)
    {
        loopCount++;
        if (s.length() == 0){
            return -loopCount;
        }
        else if (s.charAt(0) == c)
        {
            return 1;
        }
        else
        {
            return 1 + search(s.substring(1) , c);
        }
    }