Код работает нормально даже после StackOverflow - Как? - PullRequest
1 голос
/ 14 апреля 2019

Насколько я понимаю, следующий код должен вывести 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());
        }
    }

Пожалуйста, помогите мне понять это поведение.

Ответы [ 2 ]

5 голосов
/ 14 апреля 2019

Только последний вызов 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 голосов
/ 14 апреля 2019

Последний элемент, который вызывает переполнение, вернет 0 к предыдущему экземпляру, но это значение будет потеряно, поскольку все нижние экземпляры просто возвращают 100 друг другу, пока последний экземпляр не завершится, возвращая 100.

...