Partage
  • Partager sur Facebook
  • Partager sur Twitter

ArrayList nul en dehors de sa classe

Sujet résolu
    8 juillet 2019 à 12:20:44

    //Classe joueur
    
    import java.util.Scanner;
    
    import java.util.LinkedList;
    
    import java.util.ListIterator;
    
    import java.util.ArrayList;
    
    public class Joueur {
    
                protected String nom_J;
    
                protected ArrayList<Integer> gain_J;                                       
    
    //#####################################################
    
                //                                                         constructeur
    
                //#####################################################
    
                public Joueur(String pNom){
    
                            System.out.println("Création du profil du Joueur : " + pNom);
    
    nom_J=pNom;
    
                            ArrayList<Integer> gain_J = new ArrayList<Integer>();
    
                            gain_J.add(0);
    
                            //System.out.println(gain_J.size());
    
                            gain_J.add(12);
    
                            //System.out.println(gain_J.size());
    
                            //System.out.println(gain_J.get(1));
    
                }
    
                //#####################################################
    
                //                                 ###                  Accesseur                   ###                                            #
    
                //#####################################################
    
                public String get_Nom() {
    
                            return nom_J;
    
                }
    
                public ArrayList<Integer> get_gain_J() {
    
                            return gain_J;
    
                }
    
                public Integer get_1gain_J(Integer a) {
    
                            return this.gain_J.get(a);
    
    }
    
    }
    
    import java.util.Scanner;
    
    public class Main {
    
                public static void main(String[] args) {                                     
    
    Joueur J1=new Joueur("Albert");
    
    System.out.println(J1.get_gain_J());
    
    }   
    


    Bonjour,

    J'ai un souci avec un ArrayList défini et initialisé dans une classe mais dont je ne peux pas me servi dans mon main.

    Voici le code :

    Je suis débutant donc je n'ai surement pas saisi quelquechose sur ces ArrayList mais lorsque je suis dans la classe Joueur c'est initialisé (j'affiche bien la taille et le deuxième élément de l'ArrayList) mais j'affiche "null" dans mon main.

    Est ce que quelqu'un peut m'expliquer ce qui ne va pas et comment accéder à mon ArrayList depuis mon main.

    Merci

    -
    Edité par AlexisVe 8 juillet 2019 à 12:27:02

    • Partager sur Facebook
    • Partager sur Twitter
      8 juillet 2019 à 13:20:57

      Cause du bug : l'attribut "gain_J" ligne 17 est masqué, dans le constructeur, par la déclaration de ligne 29. dont la portée est locale au constructeur.

      Conseil : on gagne du temps, en posant une question, en réduisant le code source à ce qui est strictement indispensable pour exposer le problème. Ici on crée un objet, et un accesseur ne retourne pas ce qu'il faut. Le reste, on le vire.

      Ca fait gagner beaucoup de temps à tout le monde. En général, en faisant ça, on trouve tout seul et on n'a même pas besoin de poser la question, finalement.

      Version revue et corrigée

      package javaapplication70;
      
      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.List;
      
      public class JavaApplication70 {
      
          static class Joueur {
      
              protected String nom;
              protected ArrayList<Integer> gain;
      
              public Joueur(String nom) {
      
                  this.nom = nom;    // this résoud l'ambiguité entre attribut et paramètres
                  
                  // ArrayList<Integer> gain = new ArrayList<Integer>();
                  gain = new ArrayList<>();
      
                  gain.add(0);
                  gain.add(12);
              }
      
              public List<Integer> getGain() {
                  return Collections.unmodifiableList(gain);
              }
          }
      
          public static void main(String[] args) {
              Joueur j1 = new Joueur("Albert");
              System.out.println(j1.getGain());
          }
      
      }
      

      Commentaires

      • éviter de se compliquer la vie dans les noms (nom_J, gain_J)
      • utiliser les conventions standard pour les noms (camelCase pour les variables)
      • pour les accesseurs, on doit éviter de retourner une référence à un attribut interne, qui l'exposerait dangereusement à des modifications non souhaitées. D'où usage de Collections.unmodifiableList. On pourra  appliquer des get et des size à la liste qui sera retournée, mais les set, clear, remove etc provoqueront une exception. Sécurité... 

      -
      Edité par michelbillaud 8 juillet 2019 à 13:26:51

      • Partager sur Facebook
      • Partager sur Twitter
        8 juillet 2019 à 14:00:24

        Merci beaucoup pour la réponse rapide, claire et les différents conseils.
        Désolé pour mon code pas suffisament élagué et sa mise en forme.
        • Partager sur Facebook
        • Partager sur Twitter
          8 juillet 2019 à 15:21:35

          Y a pas de souci.

          Pendant que j'y suis:

          • préparer la version réduite dans une _copie_ du projet :-)
          • en règle générale ne pas "tester des trucs" dans un projet en cours en espérant que ça va le faire marcher : tester à part. Un problème à la fois. Créer un projet à part pour tester un petit truc FAIT GAGNER du temps.
          • les IDE modernes font la (re)mise en forme sans problèmes. Par exemple sous netbeans shift-alt-f. 
          • Aucun effort à faire pour le mémoriser : marquer le raccourci sur un postit sur l'écran, à l'usage ça rentrera tout seul.
          • Partager sur Facebook
          • Partager sur Twitter

          ArrayList nul en dehors de sa classe

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown