Java StackOverflowError
-
el
java.lang.StackOverflowError
en Java -
Causas de
java.lang.StackOverflowError
-
Solución de
java.lang.StackOverflowError
en Java
Este artículo aborda las posibles causas del error java.lang.StackOverflowError
en el método main()
de un programa Java.
el java.lang.StackOverflowError
en Java
El java.lang.StackOverflowError
se lanza en Java para indicar que la pila de la aplicación se ha agotado debido a una recursividad particularmente profunda. La clase java.lang.StackOverflowError
es una extensión de la clase VirtualMachineError
, que indica que la JVM
está funcionando mal o ha agotado todos sus recursos y no puede funcionar.
Causas de java.lang.StackOverflowError
Veamos un ejemplo para comprender java.lang.StackOverflowError
y las razones por las que ocurre.
Primero incluiremos un método principal en la clase de ejemplo. Después de eso, construiremos una función llamada RecursiveFunction()
, que será llamada recursivamente dentro del método principal.
En la función RecursiveFunction()
, mostraremos los números con un incremento de 1
añadido después de cada llamada.
Código fuente completo:
public class example {
static int z;
public static int RecursiveFunction(int e) {
z = z + 1;
System.out.println(" Number is : " + z);
return z + RecursiveFunction(z + 1);
}
public static void main(String[] args) {
example.RecursiveFunction(z);
}
}
Obtendrá resultados similares, como el que se muestra a continuación.
Producción :
Exception in thread "main" java.lang.StackOverflowError
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:7)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:8)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:8)
.
.
.
Hablemos de los problemas en el programa de ejemplo que causa el java.lang.StackOverflowError
.
- Discutimos un ejemplo en el que la pila del
hilo
es donde se almacenan los métodos, lostipos de datos
primitivos, lasvariables
, lasreferencias de objetos
y los valores deretorno
mientras elhilo
los realiza. Todos ellos están usando la memoria. - Se activará un
java.lang.StackOverflowError
si el tamaño de pila de unhilo
aumenta hasta el punto en que supera la cantidad máxima de memoria que se le ha asignado. - El método
Main()
llama a la funciónRecursiveFunction()
en este programa. El métodoRecursiveFunction()
se invoca repetidamente y será llamado infinitamente debido a esta implementación.
Cuando esto suceda, habrá un número ilimitado de llamadas al método RecursiveFunction()
. El límite de tamaño de pila de Thread
se superaría después de unos pocos cientos o miles de iteraciones.
El código que discutimos imprime los números pero no tiene una condición que haga que finalice. Esta es la causa del java.lang.StackOverflowError
, que indica que el tamaño de la pila se ha agotado por completo y no se puede expandir más.
Solución de java.lang.StackOverflowError
en Java
Las siguientes son posibles soluciones a la excepción java.lang.StackOverflowError
.
Encuentra líneas recursivas
Debemos analizar adecuadamente la pila de hilos
y buscar un patrón de líneas que siga apareciendo. Estas líneas apuntan al código que se invoca recursivamente.
Una vez que hayamos encontrado estas líneas, debemos hacer un análisis exhaustivo del código para determinar si la recursividad nunca llega a su fin.
Aumentar el tamaño del hilo
Tenemos la opción de aumentar el tamaño de la pila Hilo
para dejar espacio para una cantidad más significativa de comandos. Alterar los parámetros del compilador permite aumentar el tamaño máximo de la pila Thread
.
Condición de terminación
Para evitar realizar las mismas llamadas repetidamente, debe hacer un esfuerzo para implementar una condición de terminación correcta o cualquier otra condición para las llamadas recursivas para asegurarse de que finalicen.
Agreguemos una condición de terminación para que podamos solucionar el problema que ocurrió en el siguiente código de ejemplo. Usaremos la instrucción if
para verificar cada vez que z
llegue a 19
; terminará la función.
if (z == 19)
return z;
Código fuente completo:
public class example {
static int z;
public static int RecursiveFunction(int e) {
z = z + 1;
System.out.println(" Number is : " + z);
if (z == 19)
return z;
return z + RecursiveFunction(z + 1);
}
public static void main(String[] args) {
example.RecursiveFunction(z);
}
}
Producción :
Number is : 1
Number is : 2
Number is : 3
Number is : 4
Number is : 5
Number is : 6
Number is : 7
Number is : 8
Number is : 9
Number is : 10
Number is : 11
Number is : 12
Number is : 13
Number is : 14
Number is : 15
Number is : 16
Number is : 17
Number is : 18
Number is : 19
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedInArtículo relacionado - Java Error
- Arreglar Java fue iniciado por el código de salida devuelto = 1
- Arreglar JAVA_HOME no se puede determinar a partir del error de registro en R
- Arreglar java.io.IOException: No queda espacio en el dispositivo en Java
- Arreglar Java.IO.NotSerializableException en Java
- Arreglar Java.Lang.IllegalStateException de Android: no se pudo ejecutar el método de la actividad
- Arreglar Java.Lang.NoClassDefFoundError: No se pudo inicializar el error de clase