public class Foo {

    public static void main(String[] args) {
        foo();
    }

    public static void foo() {
        try {
            System.out.println("try");
            foo();
        } catch (Throwable e) {
            System.out.println("catch");
            foo();
        } finally {
                System.out.println("finally");
                foo();
        }
    }
}

谁能解释这段代码的输出?

1.在eclipse(无尽)客户端模式下输出:

尝试
尝试
....

...
...
最后尝试
最后尝试
尝试
尝试
尝试
最后尝试
最后尝试
尝试
最后尝试
最后尝试
尝试
....
....

2.在Linux(崩溃)服务器模式下输出:

尝试
尝试
...

...
尝试
尝试
尝试
尝试
尝试
尝试
PC 0x00002aaaab1c53f0和处理程序bci -1的缺少处理程序
例外:

编译异常表:
ExceptionHandlerTable(大小= 3304字节)
catch_pco = 700(1个条目)
示波器深度0处的bci -1-> pco 11039
catch_pco = 1736(1个条目)
bci -1在范围深度0-> pco 11473
catch_pco = 1756(1个条目)
bci -1在范围深度0-> pco 11433
catch_pco = 1776(1个条目)

最佳答案

我想我从《 Java Puzzlers》一书中记得这一点。 try块执行无限制的递归,这很快导致抛出StackOverflowError。 try和catch块恢复递归,但是剩余堆栈相应较小。但是,随着每个递归调用的返回,剩余的堆栈会再次变大。

最终结果是一个调用图,该调用图形成一棵树,深度取决于堆栈的大小。在主流JVM的默认堆栈大小下,树变得如此之大,以至于您必须等待数十亿年才能完全遍历它并终止程序。

编辑:这就是您在客户端模式下看到的:遍历调用图。在服务器模式下的Linux上,您看到的是JVM错误或硬件缺陷(错误的RAM可能会产生这种影响)。

09-11 16:59