IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Constructeur / Champs] Pb Valeurs null


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut [Constructeur / Champs] Pb Valeurs null
    Bonjour,

    J'ai un petit problème d'initialisation de champs dans une classe, et j'aimerais savoir ce que je fais de mal

    Pour extrait les deux classes utilisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class Accord extends Donnees {
      //Un champ de classe
      private ArrayList champ = null;
     
      //Constructeur
      public Accord(String[] champs){
        super(champs);
      }
     
      //Méthode appelée par la classe mère
      public void setChamps(){
        // Faute corrigée
        this.champ = new ArrayList();
        this.champ.add("Test");
      }
     
      //Retourne la liste
      public ArrayList getListeChamp(){
        return this.champ;
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    abstract public class Donnees {
      //Constructeur
      public Donnees(String[] champs){
        this.setChamps();
      }
     
      //Méthode abstract
      abstract public void setChamps();
    }
    Le problème est qu'après instanciation, l'ArrayList "champs" est null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Accord obj = new Accord(blabla);
    ArrayList uneListe = obj.getListeChamp();
    //uneListe est null
    En remplaçant "private ArrayList champ = null;" par "private ArrayList champ;", ça marche, mais je m'inquiète car je fais cette définition très souvent (ou "private ArrayList champ = new ArrayList();", et ça m'inquiète de ne pas avoir rencontré ce problème plus tôt.
    Ai-je vraiment de quoi m'inquiéter, ou y-a-t-il quelque chose que je fais mal ?

    Quels seraient les risques à remplacer toutes ces déclarations ("private ArrayList champ = null;" par "private ArrayList champ;") ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je tiens à te faire remarqué que le code que tu as posté contient de nombreuses erreurs et ne compile pas. Donc si tu fais autant d'étourderies en développant ton application qu'en postant sur ce forum, cela expliquerait les erreurs que tu rencontres

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    Erf oui c'est sur

    Je pense plus à des erreurs lors du post, où j'ai réécri l'exemple plutot que de copier/coller. J'corrige les erreurs tout de suite ^^

    [Edit] C'est mieux là ? Pas facile d'écrire du java sans éditeur J'aurais été plus vite à copier/coller depuis Eclipse, mais bon. Manque de café on dira !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      //Méthode appelée par la classe mère
      public void setChamps(){
        this.champs = new ArrayList();
        this.champs.add("Test");
      }
    // ....
      public ArrayList getListeChamp(){
        return this.champ;
      }
    Visiblement, t'as deux fields: champ et champs

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    Bon, je copie le code réel lol :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class MNAccords extends NDonneesBase {
     
    	/** ArrayList d'objets Versement lié à l'accord. Null si la caisse n'est pas de type versement. */
    	private ArrayList versements = null;
     
    	/** Constructeur : A partir d'une liste de colonnes et de leurs valeurs.
             */
    	public MNAccords(String[] cols, Object[] vals) {
    		super(cols,vals);
    	}
     
    	/** Surcharge de setDonnée
             */
    	protected void setDonnée(String nomCol, Object valeur) {
    		try {
    			/* unTest est une méthode qu'il est inutile de détailler pour le problème en question */
    			if ( unTest )
    				this.chargerVersements();
    		}
    		catch (NLectureException e) {
    			e.afficher();
    		}
    	}
     
    	/** Charge les montants versés stockés dans la base.
             * @throws NLectureException : En cas d'erreur lors de la sélection des versements.
             */
    	private void chargerVersements() throws NLectureException {
    		NBaseSelect sel = new NBaseSelect(tVERSEMENT,new NCleMultiple("IDAccord",this.getIdentifiant()));
    		sel.setOrderBy(new String[] {cPERIODE,cDATE});
    		sel.exécuter();
    		while ( sel.hasNext() ) {
    			// Si versements est null, on l'initialise
    			if ( versements == null )
    				versements = new ArrayList();
    			Versement donnée = new Versement(sel.getColonnes(), sel.getLigneTO());
    			versements.add(donnée);
    		}
    		sel.close();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public abstract class NDonneesBase {
     
    	/** HashMap des valeurs de la donnée en cours */
    	private HashMap valeurs = new HashMap();
     
    	 /** Constructeur : A partir des colonnes et des valeurs de l'instance en cours.
             */
    	protected NDonneesBase(String[] cols, Object[] vals) {
    		for ( int i = 0; cols != null && i < cols.length; i++ )
    			this.setValeur(cols[i],vals[i]);
    	}
     
    	/** Définition de la valeur d'une colonne.
             */
    	public void setValeur(String nomCol, Object valeur) {
    		valeurs.put(nomCol, valeur);
    		this.setDonnée(nomCol, valeur);
    	}
     
    	/** Définition d'une donnée liée à la valeur d'une colonne. */
    	abstract protected void setDonnée(String nomCol, Object valeur);
    L'enchainement est un peu moins simple à comprendre, mais bon.
    Le problème concerne uniquement l'ArrayList versements (ou l'ArrayList champ dans le premier exemple simplifié) qui est null après instanciation.

    Quand je passe en debug la construction d'un objet (MNAccords obj = new MNAccords(cols,vals); ), l'ArrayList est bien construite. Mais apres, une fois l'instruction passée, le champ repasse à null.
    Apparement, ce serait parcequ'après le construction, il y a initialisation des champs de classe. Du coup, si je mets "private ArrayList versements;" au lieu de "private ArrayList versements = null;", ça marche.
    Ou alors, je change le constructeur en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	/** Constructeur : A partir d'une liste de colonnes et de leurs valeurs.
             */
    	public MNAccords(String[] cols, Object[] vals) {
    		super(cols,vals);
    		if (unTest)
    			this.chargerVersement();
    	}
    }
    Mais la première possibilité m'embete un peu, car desfois il faut initialiser les champs, desfois non. Et pour la deuxième : quel est l'avantage de déclarer des methodes à partir du constructeur si à la fin de celui les champs sont "réinitialisés" ?

    J'ai un peu le même problème dans une sous-classe (la classe Versement notament), où MNAccords.this est null tant que le constructeur n'est pas "terminé" .

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je ne vois pas l'origine de l'erreur, mais je peux t'assurer une chose :
    faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList versements = null;
    et faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList versements;
    revient strictement au même.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Entity Framework et les champs de valeur null
    Par wstboss71 dans le forum C#
    Réponses: 0
    Dernier message: 26/10/2011, 10h34
  2. [MySQL] problème update champ float valeur null
    Par dubitoph dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/02/2009, 11h42
  3. Réponses: 2
    Dernier message: 06/02/2008, 22h14
  4. [CR] Ne pas afficher un champ de valeur nulle
    Par mavericks dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 28/03/2007, 16h06
  5. Selectionner un champ de valeur nulle
    Par arcane dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/09/2003, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo