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可能会产生这种影响)。