2
votes

StackOverflowError lors de la création d'un objet

Ce n'est donc qu'une partie de mon code où j'essaye de créer un objet. Tout ce que j'ai ajouté était le corps du constructeur. Il pourrait y avoir autre chose qui ne va pas dans mon code mais je voulais juste vérifier si c'est ainsi que créer un objet d'artiste. J'obtiens l'erreur:

public Artist(String name) {
      Artist artist = new Artist(name);
}

et à tss.Artist. (Artist.java:26) est répertorié plusieurs fois. Je suis juste un java noob confus. Toute aide serait appréciée :)

Exception in thread "main" java.lang.StackOverflowError 


5 commentaires

C'est une boucle infinie ... Vous créez un objet "Artiste" à chaque fois que vous créez un objet "artiste" ...


Vous faites une récursion infinie ici, c'est pourquoi vous avez un débordement de pile. Dans votre constructeur, vous appelez le même constructeur et ainsi de suite, jusqu'à ce que votre pile soit pleine.


C'est là que parcourir le code dans votre débogueur serait le moyen le plus rapide de voir ce que fait votre code et pourquoi.


@Wufo c'est infini, mais pas une boucle, plutôt un appel récursif


@Stultuske ouais, tu as raison. C'est un appel récursif ...


4 Réponses :


2
votes

Examinez de près cette méthode:

public Artist(String name) {
    Artist artist = new Artist(name);
}

Le constructeur de l'objetet s'appelle lui-même. Vous avez une boucle infinie et StackOverflowError est lancé.


2 commentaires

D'accord, ouais, cela a beaucoup de sens. Merci


@zzzzzz pas de problème, si vous le trouvez utile, considérez le vote positif / le marquage comme correct;)



1
votes

Vous appelez récursivement le constructeur sans aucune condition de fin qui mène une pile infinie de l'appel du constructeur .

public Artist(String name) {
    Artist artist = new Artist(name);
}

Votre nouvel artiste (nom) appellera le constructeur public Artist (string name) et qui appellera à nouveau nouvel artiste (nom) et cela continuera encore la pile de méthodes est pleine.


0 commentaires

1
votes

Un constructeur est utilisé pour instancier n'importe quel objet. Pendant que vous ajoutez un constructeur dans votre classe [dans votre cas, un constructeur paramétré], utilisez-le simplement à des fins d'initialisation.

public Artist(String name) {
  this.name = name;  // you have private variable called name in your class
 }

Si vous instanciez un objet dans le constructeur, il se terminera dans une boucle sans fin et vous aurez finalement une erreur StackOverFlow.


0 commentaires

0
votes

Je vous vois question (code) en deux parties: créer un constructeur et créer un objet de classe. Dans l'exemple suivant, j'ai mis la classe là pour montrer la structure du code.

//class should look like this ...
public class Artist {
    String artistName;
    //other attributes

    //create constructor
    public Artist(String name){
        this.artistName = name;    
    }
}


//Next two line can be placed in other class 
//(e.g. 1st line in class containing main function and 2st line in main function)
//create object/instance of class
Artist artist = new Artist(name);

//Use create instance of that class
System.out.println(artist.artistName);


0 commentaires