即使在 StackOverflow 之后,代码也能正常工作 - 如何



据我了解,以下代码应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());
        }
    }

请帮助我理解这种行为。

只有对 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 {
    }
}

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

最新更新