我目前有一个方法应该接受两个字符串,然后检查一个字符串是否作为其他字符串存在。它不会检查两种方式,因此我将字符串传递给方法的方式决定了在另一方中查找的字符串。
目前我收到 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 m
a m
m m
m m
m m
等
我哪里错了?我错了吗?堆栈跟踪显示它似乎陷入了这条线。
return checkMatch(text, regex, i++);
但缺陷点很少是失败的原因。对不起文本和代码的墙。
答案 0 :(得分:9)
我不知道其余部分是否正确,但这里有一个错误:i++
在评估之后递增i
。每次调用具有相同值的函数。你的意思可能是++i
。
答案 1 :(得分:3)
你有:
return checkMatch(text, regex, i++);
你的意思是:
return checkMatch(text, regex, ++i);
或者:
return checkMatch(text, regex, i + 1);
i++
的问题在增量之前有后增量评估为i
,所以你只是在没有推进i
的情况下陷入困境,并且最终递归溢出了堆栈。
如果在调试输出中打印i
,问题可能会更清楚。
答案 2 :(得分:0)