Java处理stackoverflow并在stackoverflow错误后继续正常执行

时间:2013-04-18 19:30:38

标签: java recursion stack-overflow

我正在尝试用Java进行递归。我只是想停止递归并继续正常的prgram执行

void doit(){
    try{
        doit();
    }
    catch (StackOverflowError e) {
        return;
    }
    System.out.println("Error");
}


statement1
doit()
statementcontinue

我希望程序在stackoverflow错误

之后继续执行到statementcontinue

3 个答案:

答案 0 :(得分:3)

你的程序完全按照你所说的去做。

每次拨打doit()时,都会:

  1. 再次致电doit()
  2. 完成后,它会打印Error
  3. 当堆栈溢出发生时,最里面的调用结束(因为你的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