1

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

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


statement1
doit()
statementcontinue

statementcontinue我希望程序在 stackoverflow 错误之后继续执行

4

3 回答 3

3

您的程序正在按照您的指示进行操作。

每次调用时doit(),它:

  1. doit()再次调用
  2. 完成后,它会打印Error.

当堆栈溢出发生时,最里面的调用完成(因为你的return),然后继续执行调用它的函数(就像任何其他函数调用一样)。
这称为弹出调用堆栈。

调用函数(也是doit())然后执行下一行(System.out.println("Error");),然后返回到它的调用函数,也就是doit()
循环重复,直到堆栈完全弹出 - 直到它到达最初调用的函数doit()

于 2013-04-18T19:32:10.103 回答
2

如果您只想在 stackOverflow 发生时打印“错误”,只需将跟踪放在 catch 块中:

void doit(){
  try{
    doit();
  }catch (StackOverflowError e) {
    System.out.println("Error");
    return;
  }
}
于 2013-04-18T19:35:18.327 回答
1

您的代码会填满堆栈,然后一旦堆栈已满,它就会触发 catch 语句。之后,其余代码继续触发......每个错误消息都是一个递归调用。您的代码正在按照您的编程方式工作。

如果您想要一个在之前和之后执行操作并具有退出条件的递归示例,那么以下应该作为您的示例(使用打印语句来阐明堆栈上发生的事情)。

例子:

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
于 2013-04-18T19:33:21.213 回答