-5

请告诉每个程序,方法调用的数量是无限的还是最终的,并解释原因。这些是来自 Bloch - Java Puzzlers #45 的示例

1)

    public static void main(String[] args) 
        {
        try
        {
            main(args);
        }
        catch(StackOverflowError e)
        {
            main(args);
        }
    }

2)

    public static void main(String[] args) 
        {
        try
        {
            main(args);
        }
        catch(StackOverflowError e)
        {
            main(args);
        }
                finally
                {
                        main(args);
                }
    }

有一点我想弄清楚。例如,JVM 中 Stack 的深度是 1024。我们运行这个程序,方法 Main 被调用了 1024 次,然后它发生了 StackOverflowError,我们第一次进入 catch 块,再次调用方法 main。那么,我们现在处于哪个深度?1024?1023?1025?? 或者第一个堆栈被填满,然后另一个堆栈被创建,我们从 0 开始?这个怎么运作?在第二个例子中,我们最终会被阻止吗?

4

1 回答 1

1

在第一个示例中,让我们将整个函数视为它并没有真正调用自己。基本上,进行了一个方法调用,如果堆栈溢出,则进行相同的方法调用。显然,如果第一次调用导致堆栈溢出,则没有任何变化,第二次调用导致堆栈溢出,没有被捕获并导致异常显示。本质上,如果它调用的方法溢出堆栈,那么方法调用的次数是有限的。现在,因为方法调用总是调用自己,所以方法会在某个时候溢出堆栈,并且由于我们之前证明的,方法调用的数量是有限的。

这是数学思维方式在计算机编程中的一个很好的应用。

至于第二个例子,也是完全一样的,只是因为finally块,在报异常之前容忍两次栈溢出,同样的逻辑会导致同样的结果。

于 2013-08-06T05:40:00.397 回答