我正在尝试用Java进行递归。我只是想停止递归并继续正常的prgram执行
void doit(){
try{
doit();
}
catch (StackOverflowError e) {
return;
}
System.out.println("Error");
}
statement1
doit()
statementcontinue
我希望程序在stackoverflow错误
之后继续执行到statementcontinue
答案 0 :(得分:3)
你的程序完全按照你所说的去做。
每次拨打doit()
时,都会:
doit()
Error
。当堆栈溢出发生时,最里面的调用结束(因为你的return
),然后继续执行调用它的函数(就像任何其他函数调用一样)。
这称为弹出调用堆栈。
调用函数(也是doit()
)然后执行下一行(System.out.println("Error");
),然后返回其调用函数,该函数也是{{1} }。
循环重复直到堆栈完全弹出 - 直到它起到最初调用doit()
的函数。
答案 1 :(得分:2)
如果只想在stackOverflow发生时打印“Error”,只需将跟踪放在catch块中:
void doit(){
try{
doit();
}catch (StackOverflowError e) {
System.out.println("Error");
return;
}
}
答案 2 :(得分:1)
你的代码填满堆栈,然后一旦堆栈满了它就会命中catch语句。之后,其余代码继续触发...每个错误消息都是一个递归调用。您的代码在编程时正常工作。
如果你想要一个前后执行的递归示例,并且有一个退出条件,下面的代码应该作为一个例子(用print语句来说明堆栈上发生了什么)。
示例:强>
public class RecurseExample {
public static void main(String[] args) {
System.out.println("hi");
doIt(1);
System.out.println("bye");
}
private static void doIt(int i){
if (i <= 3){
System.out.println("i before: " + i);
doIt(++i);
System.out.println("i after: " + i);
} else {
System.out.println("this is where the recursion stops and the execution will continue to unravel the stack");
}
}
}
输出:
hi
i before: 1
i before: 2
i before: 3
this is where the recursion stops and the execution will continue to unravel the stack
i after: 4
i after: 3
i after: 2
bye