2 attributs qui pointent sur la même valeur? comment éviter cela?

skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 1 mai 2008 - 3 avril 2008 à 09:43
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 3 avril 2008 à 11:09
Bonjour,

J'ai une classe qui stockent des attributs, un attribut borne et borneInitiale. Avant l'execution d'un traitement, je copie borne dans borneInitiale. Le set fait juste borneInitiale=borne.

Pendant le traitement, borne est modifié et à ma grande stuppeur, borne initiale aussi. J'en déduit que tous les deux pointent au même endroit en mémoire non?
Comment faire une copie indépendante de mon attribut?
J'ai essayé ceci:

 public void setBornesBak(Vector bornesInitBak){
       
        Object o;
         
          Iterator iter =bornesInitBak.listIterator();
          while (iter.hasNext()){
               o = iter.next();
               this.bornesInitiales.addElement(o);
               }
        
    
       
    
    }

mais le programme plante comme si le vecteur que j'envoie en paramètre étaut vide (ce qui n'est pas le cas).

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at metier.Attribut.setBornesBak(Attribut.java:149)
    at gui.DetailAttr.actionPerformed(DetailAttr.java:361)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

5 réponses

extraman1 Messages postés 103 Date d'inscription lundi 8 septembre 2003 Statut Membre Dernière intervention 26 décembre 2009 2
3 avril 2008 à 10:08
Salut,

En effet, quand tu fais "borneInitiale=borne" tu ne copie pas l'objet mais l'adresse.

Si borneInitiale et borne sont des attributs Vector, il faut alors que tu écris ceci => borneInitiale = (Vector)borne.clone();

Et là tu enverra une copie de borne et pas borne lui même.

Voilà tiens nous au courant.

extraman1
0
Utilisateur anonyme
3 avril 2008 à 10:24
Bonjour

C'est normal, tu fais une copie par référence (borneInitiale=borne) alros que tu t'attends à obtenir le résultat d'un clonage profond. Tu devrais faire un truc du genre :
borneInitiale = (ma_classe_borne) borne.clone();

Ce n'est pas en copiant la référence dans une liste que tu vas régler le problème. bornesInitBak est à null, c'est ça qui cause l'exception.

Bon courage

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
Utilisateur anonyme
3 avril 2008 à 10:25
Pardon extraman1, je n'avais pas vu que tu avais posté un truc pendant que je tapais.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
extraman1 Messages postés 103 Date d'inscription lundi 8 septembre 2003 Statut Membre Dernière intervention 26 décembre 2009 2
3 avril 2008 à 10:39
Salut,

Pas de soucis, au moins la réponse est clair

extraman1 le grand
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
3 avril 2008 à 11:09
Il faut donc copier individuellement chaque Borne de la liste. Voici un exemple très simple, qui le fait à l'aide d'une méthode "copy" que tu introduit dans la classe à copier (ici Borne):

import java.util.*;
public class NewMain1 {
    private Vector bornesInitiales;
    public NewMain1() {
        Vector bornesInitBak = new Vector();
        bornesInitBak.add(new Borne("1"));
        bornesInitBak.add(new Borne("2"));
        bornesInitBak.add(new Borne("3"));
        setBornesBak(bornesInitBak);
        bornesInitBak.get(1).setBorne("2a");
        System.out.println("bornesInitBak: " + bornesInitBak);
        System.out.println("bornesInitiales: " + bornesInitiales);
    }
    void setBornesBak(Vector bornesInitBak) {
        bornesInitiales = new Vector();
        for (Borne borne : bornesInitBak) {
            bornesInitiales.add(borne.copy());
        }
    }
    public static void main(String[] args) {
        new NewMain1();
    }
}
class Borne {
    private String borne;
    public Borne(String b) {
        borne = b;
    }
    public String getBorne() {
        return borne;
    }
    public void setBorne(String borne) {
        this.borne = borne;
    }
    @Override
    public String toString() {
        return "borne " + borne;
    }
    public Borne copy() {
        return new Borne(borne);
    }
}
0
Rejoignez-nous