Рекурсия (recursion)
Коротко: Метод, вызывающий сам себя, чтобы разбить задачу на меньшие подзадачи того же рода, — всегда нужен базовый случай, иначе работает бесконечно.
Подробнее: Каждый рекурсивный вызов кладёт новую запись в стек вызовов; без условия выхода (базового случая) это в итоге ведёт к StackOverflowError.
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}