Перегрузка метода производит java.lang.StackOverflowError - PullRequest
0 голосов
/ 05 сентября 2018

Как я знаю, в java есть функция перегрузки метода, поэтому мне интересно, почему метод, помеченный как B, производит java.lang.StackOverflowError. Я думаю, что это может быть связано с некоторым рекурсивным вызовом, но у меня не было никаких предупреждений компилятора. Может кто-нибудь объяснить, почему я получил исключение.

    public static void main(String[] args) {
        Set<Integer> set = getSet(1);
    }

    //A
    private static Set<Integer> getSet(List<Integer> numbers) {
        return new HashSet<>(numbers);
    }

    //B throwing exception
    private static Set<Integer> getSet(Integer number) {
        return getSet(number);
    }

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Просто посмотрите на ваш метод getSet. Вы вызываете его один раз, он снова вызывает себя.

Может быть, вы хотели это сделать?

private static Set<Integer> getSet(Integer base) {
        return getSet(Arrays.asList(base));
    }
0 голосов
/ 05 сентября 2018

Вы выполняете бесконечные вызовы на private static Set<Integer> getSet(Integer number). Первый вызов от public static void main(String[] args) После этого метод вызывает себя без какой-либо проверки, чтобы прервать последовательность собственных вызовов

 private static Set<Integer> getSet(Integer number) {
    return getSet(number);
 }

getSet перегружен, но number типа Integer вызывает себя. Это становится бесконечной последовательностью одних и тех же вызовов методов, и так как каждый вызов метода приводит к записи в стеке (для хранения локальных состояний вызова метода), стеку требуется память, которая имеет пороговое значение, которое истощается после определенного числа вызовов методов, полученных в результате в StackOverflowException.

Также нет ничего плохого в таких вызовах, если мы посмотрим с точки зрения компилятора. Единственное, что должна быть условная проверка, которая может предотвратить превращение рекурсии в бесконечную рекурсию.

0 голосов
/ 05 сентября 2018

Это:

private static Set<Integer> getSet(Integer base) {
    return getSet(base);
}

называет себя; Вы, вероятно, хотите назвать это с List:

return Arrays.asList(base); // or List.of(base) since java-9
...