代码在StackOverflow之后工作正常 - 如何?

问题描述 投票:1回答:2

根据我的理解,下面的代码应该打印0作为输出,因为堆栈已满并且应该立即退出方法。

但是,当我运行以下代码时,它会为第一种情况打印100,并为第二种情况打印1

class ErrorAndException {
        public static int callStackOverflow() {
            try {
                callStackOverflow();
                return 100;
            } catch (Error e) {
                System.out.println(e);
                return 0;
            } finally {
            }
        }

        public static void main(String[] args) {
            System.out.println(callStackOverflow());
        }
    }

案例 - 2

class ErrorAndException {
            public static int callStackOverflow() {
                try {
                    callStackOverflow();
                    return 100;
                } catch (Error e) {
                    System.out.println(e);
                    return 0;
                } finally {
                           return 1
                }
            }

        public static void main(String[] args) {
            System.out.println(callStackOverflow());
        }
    }

请帮我理解这个行为。

java error-handling stack-overflow
2个回答
5
投票

只有最后一次调用callStackOverflow()StackOverflowError被抛出的那个)才会返回0。但是当它返回时,先前对callStackOverflow()的调用都返回100.你的main方法只打印初始调用callStackOverflow()返回的值,即100

如果你想将0返回到main方法,callStackOverflow()必须返回递归调用返回的值:

public static int callStackOverflow() {
    try {
        return callStackOverflow();
    } catch (Error e) {
        System.out.println(e);
        return 0;
    } finally {
    }
}

3
投票

导致溢出的最后一项将返回0到前一个实例,但该值将丢失,因为所有较低的实例只返回100到另一个,直到最终实例退出返回100。

© www.soinside.com 2019 - 2024. All rights reserved.