2011-11-05 32 views
6

Este código muestra error en tiempo de ejecución:Declarar una instancia de una clase dentro de esa clase

class Animal { 
    Animal object1 = new Animal(); 

    public static void main(String[] args) {  
     Animal obj = new Animal(); 
    } 
} 

Este es el código ligeramente diferente con Animal obj = new Animal(); esta línea de método principal comentada. este código no muestra ningún error de tiempo de ejecución.

class Animal { 
    Animal object1 = new Animal(); 

    public static void main(String[] args) {  
     // Animal obj = new Animal(); 
    } 
} 

¿Cómo se causa esto y cómo puedo solucionarlo? Estoy usando el símbolo del sistema para ejecutar este código.

+0

Aunque esta es obvia, pero ¿por qué omitió el mensaje de error exacto de la pregunta? En las preguntas futuras, incluya siempre el mensaje completo de error/excepción y stacktrace, ya que normalmente ya contienen la respuesta. Entonces uno podría traducirlo fácilmente para usted en términos sencillos. – BalusC

+0

Mi error !! vio esta línea llenar mi símbolo del sistema: "en Animal. (Animal.java:2)" (es el error de tiempo de ejecución que obtuve cuando ejecuté el último código) –

Respuesta

13

Si tiene una variable miembro que se inicializa en una instancia de la misma clase, cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando esa instancia se crea, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando esa instancia se crea, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando esa instancia se crea, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando se crea esa instancia, también tendrá una variable miembro que se inicializa a una instancia de la misma clase, y cuando esa instancia es crea Ted, también tendrá una variable miembro que es inicializado a una instancia de la misma clase ...

y luego la pila se desbordará y se detendrá. Está bien que un objeto tenga un puntero a otra instancia de la misma clase que un miembro, pero no está bien crear esa instancia en el constructor, o hacer que se inicialice en el cuerpo de la clase, o creará objetos recursivamente. hasta que tu pila se desborde. Normalmente, si desea dicha variable miembro, entonces acepta el objeto como un argumento de constructor.

+0

obtengo un error de stackoverflow similar a la recursión infinita ? ¿Viene durante el tiempo de ejecución o compilación en este caso? –

+0

@PranavNandan Sucede en tiempo de ejecución, y sí, un desbordamiento de pila es esencialmente el resultado de una computadora finita que intenta hacer una recursión infinita. La recursividad infinita está tratando de crear una gran pila infinita, pero la memoria reservada para la pila es finita, por lo que eventualmente se agota. –

2

Es un desbordamiento de pila.

Es similar a llamar a una función desde la misma función, así:

void func(){ 
    func(); 
} 

se repetirá hasta que la pila llena, y luego el programa se bloqueará.

Saludos.

5

Respuesta corta recursividad infinita.

Respuesta larga si quieres estructuras de datos recursivas por el estilo, se puede hacer algo como esto:

public class A { 
    A object1; 
    public A(A member) { 
    this.object1 = member; 
    } 
    public static void main(String[] args) { 
    A item = new A(new A(null)); // note the base case/termination of the recursion! 
    } 
} 

O:

public class B { 
    B object1; 
    public void init() { 
    object1 = new B(); 
    } 
    public static void main(String[] args) { 
    B item = new B(); 
    item.init(); 
    // now item.object1 != null, but item.object1.object1 == null 
    } 
} 

En cualquiera de los casos, tendrá que “centinela” o “ hoja "nodos en su estructura de datos, que apuntan a un valor de null.

Cuestiones relacionadas