StackOverflowError en Java con ejemplos

StackOverflowError es un error que Java no permite detectar, por ejemplo, cuando la pila se queda sin espacio, ya que es uno de los errores de tiempo de ejecución más comunes que uno puede encontrar.

La causa principal de StackOverflowError es que no hemos proporcionado la condición de terminación adecuada para nuestra plantilla o función recursiva , lo que significa que se convertirá en un bucle infinito .

¿Cuándo se encuentra StackOverflowError?

Cuando invocamos un método, se crea un nuevo marco de pila en la pila de llamadas o en el tamaño de la pila de subprocesos. Este marco de pila contiene parámetros del método invocado, principalmente las variables locales y la dirección de retorno del método. La creación de estos marcos de pila será iterativa y se detendrá solo cuando el final del método invocado se encuentre en los métodos anidados. En medio de este proceso, si JVM se queda sin espacio para los nuevos marcos de pila que deben crearse, arrojará un StackOverflowError.

Por ejemplo: Falta de condición adecuada o no terminación. Esta es principalmente la causa de esta situación denominada recursividad infinita o no terminada.

A continuación se muestra la implementación de la recursividad infinita:

// Java program to demonstrate
// infinite recursion error
  
public class StackOverflowErrorClass {
    static int i = 0;
  
    // Method to print numbers
    public static int printNumber(int x)
    {
  
        i = i + 2;
        System.out.println(i);
        return i + printNumber(i + 2);
    }
  
    public static void main(String[] args)
    {
        // Recursive call without any
        // terminating condition
        StackOverflowErrorClass.printNumber(i);
    }
}

Error de tiempo de ejecución:

Error de tiempo de ejecución en el código Java: – Excepción en el subproceso «principal» java.lang.StackOverflowError
en java.io.PrintStream.write(PrintStream.java:526)
en java.io.PrintStream.print(PrintStream.java:597)
en java .io.PrintStream.println(PrintStream.java:736)
en StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:13)
en StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
en StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
.
.
.

Nota: Ejecute esto en su sistema para ver un error arrojado, debido al tamaño de la pila, es posible que esto no muestre el error en el IDE en línea.

¿Cómo arreglar StackOverflowError?

  1. Evitar llamadas repetitivas: intente introducir una condición de terminación adecuada o alguna condición para las llamadas recursivas para asegurarse de que finalicen.

    A continuación se muestra la implementación con la condición de terminación adecuada:

    // Java Program to demonstrate proper
    // use of terminating condition
      
    // Printing natural numbers
    public class stackOverflow {
        static int i = 0;
        public static int printNumber(int x)
        {
      
            i = i + 2;
            System.out.println(i);
      
            // Terminating condition
            if (i == 10)
                return i;
      
            return i + printNumber(i + 2);
        }
      
        public static void main(String[] args)
        {
            stackOverflow.printNumber(i);
        }
    }
    Producción:

    2
    4
    6
    8
    10
    
  2. Aumentar el tamaño de la pila: el segundo método podría ser, si nota que se implementó correctamente y aún vemos un error, podemos evitarlo solo aumentando el tamaño de la pila para almacenar la cantidad requerida de llamadas recursivas. Esto se logra cambiando la configuración del compilador.

    Las relaciones cíclicas entre clases son las relaciones que se generan cuando dos clases diferentes se instancian entre sí dentro de sus constructores.

    Se encuentra StackOverflowError porque el constructor de la Clase A1 está instanciando la Clase A2, y el constructor de la Clase A2 está nuevamente instanciando la Clase A1, y ocurre repetidamente hasta que vemos StackOverflow. Este error se debe principalmente a la mala llamada de los constructores, es decir, llamarse entre sí, lo que ni siquiera es necesario, y tampoco tiene ningún significado, por lo que podemos evitar introducirlos en los códigos.

    A continuación se muestra la implementación de relaciones cíclicas entre clases:

    // Java Program to demonstrate
    // cyclic relationship between class
      
    public class A1 {
        public A2 type2;
        public A1()
        {
      
            // Constructor of A2 is called
            // hence object of A2 is created
            type2 = new A2();
        }
      
        public static void main(String[] args)
        {
      
            // Cycle is started by
            // invoking constructor of class A1
            A1 type1 = new A1();
        }
    }
      
    class A2 {
        public A1 type1;
        public A2()
        {
      
            // Constructor of A1 is called
            // hence object of A1 is created
            type1 = new A1();
        }
    }

    Error de tiempo de ejecución:

    Error de tiempo de ejecución en el código Java: – Excepción en el subproceso «principal» java.lang.StackOverflowError
    en A2.(A1.java:32)
    en A1.(A1.java:13)
    en A2.(A1.java:32)
    .
    .
    .

    Nota: Esto seguirá repitiéndose, Infinite Recursion es visto por estas infinitas llamadas cíclicas.

Publicación traducida automáticamente

Artículo escrito por sanskar_bindal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *