Вы выполняете бесконечные вызовы на 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
.
Также нет ничего плохого в таких вызовах, если мы посмотрим с точки зрения компилятора. Единственное, что должна быть условная проверка, которая может предотвратить превращение рекурсии в бесконечную рекурсию.