factorial(n) paso a pasoDesbordamiento aritméticoUn int solo guarda valores hasta 2.147.483.647. Si una multiplicación se pasa, Java no lanza ningún error: se queda con los bits que caben y el resultado sale mal (incluso negativo o 0). Con int ocurre a partir de 13! y con long a partir de 21!; para valores mayores harían falta BigInteger.
StackOverflowErrorCada llamada que todavía no ha terminado ocupa un marco en la pila. Si hay demasiadas llamadas pendientes a la vez, la pila se llena y la JVM lanza StackOverflowError: el programa termina sin resultado. No depende del tipo (int o long), sino del número de llamadas encadenadas. Aquí la pila es muy pequeña para poder verlo; en una JVM real caben miles de marcos (depende de -Xss).
En azul, el camino desde main hasta la llamada activa: son justo los marcos que hay ahora en la pila. En verde, las llamadas que ya han terminado con su resultado.
Atajos: ← → paso a paso · Espacio reproducir/pausa · Inicio Fin
Material de apoyo de Programación 1º DAM · © David Martínez Peña · CC BY-NC-SA 4.0