StackOverflower错误处理和Java恢复

StackOverflower错误处理和Java恢复,java,exception,stack-overflow,Java,Exception,Stack Overflow,有人能解释一下StackOverflowerr是如何工作的吗 我知道无休止的递归会导致StackOverflowerError,但是在堆栈满后会执行其他方法吗?我已经处理了catch块中的错误。我想知道java是如何运行的,或者是如何从捕获到的错误中恢复过来的 示例代码: public class Test { public static void main(String[] args) { try { show();

有人能解释一下StackOverflowerr是如何工作的吗

我知道无休止的递归会导致StackOverflowerError,但是在堆栈满后会执行其他方法吗?我已经处理了catch块中的错误。我想知道java是如何运行的,或者是如何从捕获到的错误中恢复过来的

示例代码:

public class Test {    
    public static void main(String[] args) {    
        try {
            show();
        } catch(StackOverflowError e) {
            System.out.println(e);
        }    
        System.out.println("After StackOverFlowError");

        display();    
    }

    static void show() {
        show();
    }

    static void display() {
        System.out.println("Hello New Function");
    }    
}
输出为:


正如Tim所说,您不需要处理StackOverflowerError,如果可能的话,可以尝试更好的方法,比如迭代,或者在多次调用后完成调用堆栈。

是的,java已经从中恢复。 抛出StackOverflowerError时,它将通过所有show()方法展开堆栈,直到它返回到catch块。此时,堆栈上只剩下main(),您可以继续执行程序而不会出现问题

您的调用堆栈将如下所示:

main()
   show()
      show()
         show()...

不管堆栈内存允许它移动多深,当最后一个show()方法获得异常时,它会将异常抛出给每个show方法,然后这些方法会重新执行异常,直到它到达main中的catch块并打印错误

通常,您不会从运行时异常的
堆栈溢出错误中恢复。如果你的递归失败了,就这样,修复你的代码或者在不同的条件下再次运行它。我想你还没有明白这个问题。StackOverFlowError是特意生成的,目的是了解它是如何工作的,以及java是如何从中恢复的。我的问题是,在无休止的递归之后,堆栈是否已满,从技术上讲,不应该将其他方法推入该堆栈,那么display()是如何被调用的?java从中恢复了吗?你发现了异常,你对什么感到惊讶吗?递归仍然失效,如果您希望返回结果,则可能无法得到它。通常,在实践中,您不会捕获未经检查的异常,如
StackOverflowerError
。您捕获了异常,您是否对某些事情感到惊讶?递归仍然失效,如果您希望返回结果,则可能无法得到它。通常,在实践中,您不会捕获未经检查的异常,如
StackOverflowerError
。我认为您没有得到这个问题。StackOverFlowError是特意生成的,目的是了解它是如何工作的,以及java是如何从中恢复的。我的问题是,在无休止的递归之后,堆栈是否已满,从技术上讲,不应该将其他方法推入该堆栈,那么display()是如何被调用的?java从中恢复了吗?哦,当然,只要您在运行的线程中发现错误,它就会恢复,如您的代码片段所示。如果让错误被抛出到最上面的调用,那么应用程序/运行线程将终止(系统退出),因为它得到了错误,并且没有人处理它。感谢您的解释。
main()
   show()
      show()
         show()...