2010-09-09 4 views
-1

Salut quelqu'un peut-il m'expliquer pourquoi cet extrait de code me donne StackOverflowError J'apprécie vraiment si vous pouvez expliquer ce qui se passe quand instanceObj initialise et appelle le constructeur ObjectTest et le constructeur java.lang.Object . Il me semble que le constructeur ObjectTest boucle encore et encore. Mais je ne connais pas la raison exacte? Donc, toute suggestion ...java StackOverflowError lors de la création d'objets locaux et d'instance


public class ObjectTest { 

    public ObjectTest() { 

    } 


    ObjectTest instanceObj = new ObjectTest(); 


    public static void main(String[] args) { 

    ObjectTest localObj = new ObjectTest(); 
    } 
} 
+0

@all Merci pour votre aide genre que je lis tous vos messages et avons obtenu quelques connaissances et résoudre mon problème . – ddfnfal

Répondre

3

Voyons voir ce qui sera exécuté:

  1. main() créer une nouvelle instance de ObjectTest
  2. la classe ObjectTest a un champ instanceObj qui contiendra un ObjectTest
  3. le instanceObj en initialisé avec un nouveau ObjectTest
  4. passez à l'étape 2

Je pense que vous vouliez quelque chose comme ceci:

public class ObjectTest { 
    private static ObjectTest instanceObj; 

    private ObjectTest() { 
    } 

    public static ObjectTest getInstance() { 
     if (instanceObj != null) { 
      instanceObj = new ObjectTest(); 
     } 
     return instanceObj; 
    } 

    public static void main(String[] args) { 

     ObjectTest localObj = ObjectTest.getInstance(); 
    } 
} 

Ou ceci:

public class ObjectTest { 
    private static final ObjectTest instanceObj = new ObjectTest(); 

    private ObjectTest() { 
    } 

    public static ObjectTest getInstance() { 
     return instanceObj; 
    } 

    public static void main(String[] args) { 

     ObjectTest localObj = ObjectTest.getInstance(); 
    } 
} 

C'est le modèle Singleton.


Sur le même sujet:

3

Chaque ObjectTest exemple fait référence à une autre ObjectTest — nommé instanceObj. Cette instance est construite lorsque son instance "parent" est créée & hellip; et résulte ainsi dans la construction d'un autre, et un autre, ad infinitum.

Voici le code équivalent qui peut indiquer la faille plus clairement:

public class ObjectTest { 

    ObjectTest instanceObj; 

    public ObjectTest() { 
    instanceObj = new ObjectTest(); /* Recursively call the constructor. */ 
    } 

} 
6

Vous appelez le constructeur pour créer une nouvelle instance de votre objet. Il a une référence à une autre instance, que vous initialisez avec une autre nouvelle instance de ObjectType qui, à son tour, fait la même chose. c'est un nombre infini d'appels jusqu'à ce que vous obteniez cette erreur.

Cela fonctionnera.

public class ObjectTest { 

    public ObjectTest() { 

    } 


    public static void main(String[] args) { 

    ObjectTest localObj = new ObjectTest(); 
    } 
} 
1

Parce que vous créez vous-même récursivement.

Vous devez injecter votre instance ou demander à une autre classe de gérer cette propriété.

public class ObjectTest { 

public ObjectTest() { 
    instanceObj = null; 
} 
public ObjectTest(ObjectTest myObjectTest) { 
    instanceObj = myObjectTest; 
} 
} 
+0

Quelle section de la spécification Java explique cela? – chrisrhyno2003

Questions connexes