【问题标题】:StackOverflow when checking if one string is contained in anotherStackOverflow 检查一个字符串是否包含在另一个字符串中
【发布时间】:2014-04-14 14:36:58
【问题描述】:

我目前有一个方法应该接受两个字符串,然后检查一个字符串是否作为子字符串存在于另一个字符串中。它不会同时检查两种方式,因此我将字符串传递给方法的方式决定了在另一种方式中查找的字符串。

目前我收到 stackoverflow 错误。

public boolean checkMatch(String text, String regex, int i){

    int regexL = regex.length();

        if(i == regexL){
            return true;
        }   

        System.out.println(text.charAt(i) + " " + regex.charAt(i));

        if(text.charAt(i) == regex.charAt(i)){
            return checkMatch(text, regex, i++);
        }
        else if(text.charAt(i) != regex.charAt(i)){

            if(text.substring(1) == ""){
                return false;
            }               
            else if(text.substring(1) != ""){
                return checkMatch(text.substring(1), regex, 0);
            }
        }
        return false;

}

我正在以我的名字为例进行测试。

@Test public void test_52() {
    assertEquals(true, checkMatch("Samual", "mu", 0));
}

控制台溢出后的样子。

S 米

一米

米米

米米

米米

我哪里出错了?我迭代错了吗?堆栈跟踪显示它似乎被此行捕获。

return checkMatch(text, regex, i++);

但缺陷点很少是故障点。对不起,文字和代码的墙。

【问题讨论】:

  • 那么什么值被传递了?我的意思是,实际 值——它们是什么?为什么这会阻止状态被推进?
  • 您也可以将checkMatch的正文替换为这个单行代码return text.indexOf(regex)==i;

标签: java string substring stack-overflow


【解决方案1】:

我不知道其余的是否正确,但这里有一个错误:i++increments i 经过评估。您每次都使用相同的值调用您的函数。你的意思可能是++i

【讨论】:

  • 我想他甚至可能想要 i+1。
  • 这个设置也是一样,不过我同意这样可以避免这种bug。
  • 哇,刚刚成功,我的测试在我做了那个小修复后立即通过了。我很好奇我以前怎么从来没有遇到过这个错误?非常感谢。
  • @SHolmes 如果您发现它解决了您的问题,请不要忘记接受这个答案。 :)
【解决方案2】:

你有:

return checkMatch(text, regex, i++);

你的意思是:

return checkMatch(text, regex, ++i);

或者:

return checkMatch(text, regex, i + 1);

i++ 的问题是后增量计算为i增量之前,所以你只是在没有推进i 的情况下被卡住,最终递归溢出堆栈.

如果您在调试输出中打印了i,问题可能会更清楚。

【讨论】:

    【解决方案3】:

    您可以只使用indexOf 方法:

     System.out.println("Samual".indexOf("mu") > 0);
    

    输出:

    true
    

    【讨论】:

    • 这肯定是在生产代码中执行此操作的正确方法,但在我看来,OP 这样做是出于教育目的。
    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多