[英]java try-catch-finally recursion question
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();
}
}
}
谁能解释这个代码的output?
1.output on eclipse(无尽)客户端模式:
try try .... ... ... tryfinallyfinally tryfinallyfinally try try try tryfinallyfinally tryfinallyfinally try tryfinallyfinally tryfinallyfinally try .... ....
2.output on linux(崩溃)服务器模式:
try try ... ... try try try try try try MISSING EXCEPTION HANDLER for pc 0x00002aaaab1c53f0 and handler bci -1 Exception: Compiled exception table : ExceptionHandlerTable (size = 3304 bytes) catch_pco = 700 (1 entries) bci -1 at scope depth 0 -> pco 11039 catch_pco = 1736 (1 entries) bci -1 at scope depth 0 -> pco 11473 catch_pco = 1756 (1 entries) bci -1 at scope depth 0 -> pco 11433 catch_pco = 1776 (1 entries)
我想我从“Java Puzzlers”一书中记得这一点。 try 块执行无限递归,这很快导致 StackOverflowError 被抛出。 try 和 catch 块恢复递归,但剩余堆栈相对较小。 但是,随着每个递归调用返回,剩余的堆栈再次变大......
最终结果是 forms 的调用图,其深度取决于堆栈的大小; 使用主流 JVM 的默认堆栈大小,树变得如此之大,以至于您必须等待数十亿年才能完全遍历它并终止程序。
编辑:这就是您在客户端模式下看到的:调用图的遍历。 您在服务器模式下的 Linux 上看到的是 JVM 错误或硬件缺陷(有故障的 RAM 可能会产生这种影响)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.