java.lang.StackOverflowError se lanza normalmente cuando hay métodos recursivos que se llaman infinitamente. Por lo tanto el llega un punto en que el Stack se va llenando y explota.
En la memoria Stack se almacenan las variables locales y llamadas a métodos. Aquí un pequeño ejemplo de como funciona la memoria Stack.
public static void main
(String[] args
) { int x = 5;
saludo();
}
void saludo() {
go()
}
En la linea 2 el stack se puede visualizar asi.
main (metodo) - x (variable local)
Luego linea 3:
saludo() (metodo)
main (Metodo) - x (variable local)
Y asi se va llenando la memoria Stack, cuando el metodo saludo() se complete, entonce el metodo saludo() se remueve del stack y vuelve al metodo main, pero si el metodo saludo llama a otro metodo, este se agrega al Stack, y cuando ese otro metodo termine, se remueve del stack y luego vuelve al metodo saludo, y cuando saludo termine, se remueve del stack y vuelve al metodo main hasta que el metodo main se completa.
Te explico el error lógico que cometes, y por eso sale la excepción.
Las clases:
class Carta extends Baraja {}
class Baraja {}
Tomando en cuenta que el loop for se encuentra en el constructor de la clase Baraja.
Tu metodo main:
public static void main
(String[] args
) {
Carta miCarta = new Carta("Tres", "Copas");
Baraja miBaraja = new Baraja();
System.
out.
print("La posicion de mi carta es: " + miCarta.
posicionCarta(numero, palo
)); }
En la linea 4(marcada), se instancia la Clase Baraja y se ejecuta el constructor de Baraja.
Baraja constructor:
public Baraja() { //Genera todas las cartas
String caras
[] = {"As",
"Dos",
"Tres",
"Cuatro",
"Cinco",
"Seis",
"Siete", "Sota", "Caballo", "Rey"};
String palos
[] = {"Bastos",
"Copas",
"Oros",
"Espadas"}; paquete = new Carta[40];
for (int i = 0; i < paquete.length; i++) {
paquete[i] = new Carta(caras[i % 10], palos[i / 10]);
}
}
El error se encuentra en la linea 7(marcada), la linea 7 Crea una instancia de la Clase Carta y como la clase Carta extiende a la Clase Baraja (Clase padre), entonce java primero llama al Constructor de la clase padre (En este caso Baraja) y lo ejecuta:
Baraja constructor:
public Baraja() { //Genera todas las cartas
String caras
[] = {"As",
"Dos",
"Tres",
"Cuatro",
"Cinco",
"Seis",
"Siete", "Sota", "Caballo", "Rey"};
String palos
[] = {"Bastos",
"Copas",
"Oros",
"Espadas"}; paquete = new Carta[40];
for (int i = 0; i < paquete.length; i++) {
paquete[i] = new Carta(caras[i % 10], palos[i / 10]);
}
}
Y en la linea 7, de nuevo hace una una instancia de la clase Carta y como esta extiende a la clase Baraja, se llama primero al constructor de la clase Baraja y se ejecuta, y pasa lo mismo que ahora. Entonce como sigue pasando lo mismo y ningun constructor de la clase Baraja se llega a completar sino que se van aumentando, la memoria Stack se va llenando ya que nunca los constructores no se llegan a ejecutar por completo y por lo tanto nunca se llegan a remover de la memoria Stack. Y por eso el código lanza la excepción java.lang.StackOverflowError
Por esa razón, se recomienda solo instanciar variable en constructores y no hacer llamada a métodos.El bucle for y eso, déjaselo a un método y recuerda no llamar a ningún método desde el constructor....
Saludos.