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

Java Discussion :

conserver ma liste d'objets sans Pointeur Null ...


Sujet :

Java

  1. #1
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut conserver ma liste d'objets sans Pointeur Null ...
    Bonjour, j'ai fait une classe afin de conserver des objets Threads dans un
    tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class ObjetMemoire {
    	ObjetProxi[] ListObjet;
    	ObjetMemoire(ObjetProxi[] ListObjet )
    	{
    		this.ListObjet=ListObjet;
    	}
    	ObjetProxi[] GetObjetThread ()
    	{
    		return this.ListObjet;
    	}
    }
    Cette classe s'instancie sans probleme dans mon main cf ci-dessous

    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
     
     public static void main(String args[])
    {
     
      ObjetProxi  [] ListObjet ;
      ObjetMemoire ObjetMem;
      Affichage obj5;
      ListObjet = new ObjetProxi[3];
     
      for (int i=0;i<3;i++) ListObjet[i]=new ObjetProxi("obj",i);
     
      obj5 = new Affichage(ListObjet);
      for (int i=0;i<3;i++) ListObjet[i].start();
      // je mets ma liste d'objet dans un objet memoire
      ObjetMem = new ObjetMemoire(ListObjet);
     
    }
    Mais quand je veux recuperer le contenu de la classe via le GetObjetThread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListObjet=ObjetMem.GetObjetThread ();
    j'ai un NullPointerAssignement alors que j'ai bien des données dans ma classe (vérifié au debugger) quelle bétise ai je donc bien pu encore faire.

    D'avance merci de vos idées.

  2. #2
    Membre habitué Avatar de nicgando
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 128
    Points : 163
    Points
    163
    Par défaut
    comme cela je ne vois pas de problème, cela peut venir de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj5 = new Affichage(ListObjet);
    il n'y a pas de modification dans cette classe de l'objet ListObjet ?

    De même tu obtiens bien un 'NullPointerAssignement' ?
    Peux-tu aussi donner ta stack trace ?

    Merci.

  3. #3
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut Re: conserver ma liste d'objets sans Pointeur Null ...
    Salut,

    Citation Envoyé par comme de bien entendu
    Mais quand je veux recuperer le contenu de la classe via le GetObjetThread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListObjet=ObjetMem.GetObjetThread ();
    Pourrais-tu fournir la portion de code autour de cette ligne?
    Ton main instancie bien un objet ObjetMemoire, mais on ne sait pas sur quel objet tu cherches à récupérer les données? (je n'ai pas vu la ligne qui déclenche l'erreur dans le main, donc ça doit être ailleurs... non?)

    Enfin... j'espère que tu ne penses pas que ton ObjetMem de la ligne d'erreur est celui du main...
    Y'aurait pas une déclaration locale par hasard?

    Mais bon, donne des précisions et la portion de code autour de l'erreur, qu'on ait le contexte...

  4. #4
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Bonjour,
    Je vous passe le code pour que ma question soit plus clair.


    Recap :
    Affichage cree un JPanel qui creent les ObjetsProxi, les ObjetsProxi
    regardent ou sont les autres objets pour pas se "marcher dessus" et pour cela accedent à la classe ObjetMemoire où j'ai rangé les objets.

    J'ai quatre classe :
    Une classe Affichage, qui contient mon main()


    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
     
    import javax.swing.*;
    public class Affichage
    {
    private ObjetProxi[] ListObjet ;
     
    Affichage (ObjetProxi  [] ListObjet)
      {
      this.ListObjet=ListObjet;
      JFrame uneFrame = new JFrame("test");
      monJPanel unJpanel = new monJPanel(ListObjet);
      uneFrame.setContentPane(unJpanel);
      uneFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      uneFrame.setSize(300,300);
      uneFrame.setVisible(true);
     }
     public static void main(String args[])
    {
     
      ObjetProxi  [] ListObjet ;
      ObjetMemoire ObjetMem;
      Affichage obj5;
      ListObjet = new ObjetProxi[3];
     
      for (int i=0;i<3;i++) ListObjet[i]=new ObjetProxi("obj",i);
     
      obj5 = new Affichage(ListObjet);
      for (int i=0;i<3;i++) ListObjet[i].start();
      // je mets ma liste d'objet dans un objet memoire
      ObjetMem = new ObjetMemoire(ListObjet);
      }
     }
    une classe ObjetMemoire pour accéder à mon tableau d'objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ObjetMemoire {
    	ObjetProxi[] ListObjet;
     
    	ObjetMemoire(ObjetProxi[] ListObjet )
    	{
    		this.ListObjet=ListObjet;
    	}
    	ObjetProxi[] GetObjetThread ()
    	{
    		return this.ListObjet;
    	}
    }

    enfin une classe ObjetProxi qui derive de Thread et qui gere les objets

    le ListObjet=ObjetMem.GetObjetThread ();

    qui genere l'erreur

    Exception in thread "Thread-0" java.lang.NullPointerException
    at ObjetProxi.run(ObjetProxi.java:125)
    Exception in thread "Thread-1" java.lang.NullPointerException
    at ObjetProxi.run(ObjetProxi.java:125)
    Exception in thread "Thread-2" java.lang.NullPointerException
    at ObjetProxi.run(ObjetProxi.java:125)


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    // modelisation d un objet avec des Threads
    public class ObjetProxi extends Thread
    {
    static int lagraine=0;
    static int tabPosX[];
    static int tabPosY[];
    static int tabPosZ[];
    static int NombreDobjets=0;
    private int x, y, z;
    private String obj;
    public int numero;
    ObjetMemoire ObjetMem;
     
    public ObjetProxi(String obj,int numero)
    {
    if (numero > NombreDobjets) NombreDobjets = numero;
    this.numero=numero;
    tabPosX = new int[10];
    tabPosY = new int[10];
    tabPosZ = new int[10];
    lagraine++;
    Random r = new Random(lagraine);
    x= r.nextInt(10);
    y= r.nextInt(10);
    z= r.nextInt(10);
    System.out.println ("aleatoire ="+x);
    this.obj=obj;
    System.out.println ("je suis un objet"+this.obj);
    }
    private int choix_nouvelle_direction(int varCoo,int limite)
    {
    Random r = new Random();          
    if (varCoo>limite) return -2;
    if (varCoo<0) return 2;
    return (r.nextInt (3)-1);
    }
    public int GetX()
    {
    return this.x;
    }
     
    public int GetY()
    {
    return this.y;
    }
     
    public int GetZ()
    {
    return this.z;
    }
     
    private int VerifPosition(int tabPos[],int coordonnee)
    {
    int i=0;
    while (i<3)
      { 
      if (i != this.numero)
        {
        System.out.println ("i="+i+"tabPos"+(tabPos[i]));
        System.out.println ("i="+i+"coordonnee"+coordonnee);
        System.out.println ("i="+i+"ecart"+(tabPos[i]-coordonnee));
        if (((tabPos[i]-coordonnee)*(tabPos[i]-coordonnee))<50)
          {
          System.out.println (tabPos[i]-coordonnee);
          System.out.println ("ecart :" +"i "+ i+" "+ this.numero +" tableau =  "+ tabPos[i]+"coord =  "+ coordonnee);
          coordonnee=coordonnee+10;  
          }
        }
        i++;
      }
    return coordonnee;
    }
     
    private double distance(int j,int k,ObjetProxi[] ListObjet)
    {
     
    	int diff;
    	int carre1,carre2,carre3;
    	diff=ListObjet[j].x-ListObjet[k].x;
    	carre1=diff*diff;
    	diff=ListObjet[j].y-ListObjet[k].y;
    	carre2=diff*diff;
    	diff=ListObjet[j].z-ListObjet[k].z;
    	carre3=diff*diff;
    	return Math.sqrt(carre1+carre2+carre3);
     
     
    }
     
     
    public void run()
    {
    int dx,dy,dz;
    int var;
    ObjetProxi[] ListObjet;
    try{
      for (int i=0;i<100;i++)
      {
      dx=choix_nouvelle_direction(x,100);
      dy=choix_nouvelle_direction(y,100);
      dz=choix_nouvelle_direction(z,100);
      // on recupere le numero de l objet;
     
      int val = this.numero;
     
     
     
      tabPosX[val]=this.x;
      tabPosY[val]=this.y;
      tabPosZ[val]=this.z;
     
    // LA OU SE TROUVE L ERREUR  
      ListObjet=ObjetMem.GetObjetThread ();
    // ========================= 
     
     
    Random r = new Random(lagraine);
     
      for (int j=0;j<NombreDobjets;j++)
      {
    	  for( int k=0;k<NombreDobjets;k++)
    	  {
    		  if (j !=k )
    		  {
    			 while (distance(j,k,ListObjet)<5)
    			 {
    				 var=r.nextInt(3);
    				 if (var==0) ListObjet[j].x++;
    				 if (var==1) ListObjet[j].y++;
    				 if (var==2) ListObjet[j].z++; 
    			 }	  		 			  
    		  }		  
    	  }
      }
      System.out.println ("======================");
     
      sleep(100);
      System.out.println("objet= "+this.numero+ "  "+tabPosX[val]+ " "+tabPosY[val]+ " "+tabPosZ[val]+ " ");
      }
    }
    catch (InterruptedException e) {}
    }
    }
    Tant que je j'y suis je mets la classe JPanel qui instancie les ObjetsProxi et generent l'affichage

    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
    42
    43
    44
    45
    46
    47
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import java.lang.Object.*;
    import java.lang.String.*;
     
     
     
    public class monJPanel extends JPanel
    {
    int x,y;
    ObjetProxi [] ListObjet;
    ObjetProxi A;
    public void paintComponent(Graphics g) {
            super.paintComponent(g);  
            for (int i=0;i<ListObjet.length;i++)
            {
            x=ListObjet[i].GetX();         
            y=ListObjet[i].GetY();   
            g.fillOval(x,y,20 ,20);
            String test = new String();
     
            String machaine = Integer.toString(ListObjet[i].numero);
           g.drawString(machaine,x+15,y+35);
            String machainei = Integer.toString(i);
           g.drawString(machainei,150+i*10,100);
            String tailleTab = Integer.toString(ListObjet.length);
            g.drawString(tailleTab,180,50);
            }
        }
    monJPanel(ObjetProxi [] mesObjet)
    {
    ListObjet=new ObjetProxi[3];
    for (int i=0;i<mesObjet.length;i++) ListObjet[i]=mesObjet[i];
    System.out.println("test="+ListObjet.length);
     
     
    javax.swing.Timer t = new javax.swing.Timer(10, new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  repaint();
              }
           });
    t.start();
    //t.stop();
    }
    }

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Dans ObjetProxi, tu n'affecte jamais de valeur a ObjetMemoire ObjetMem. De fait ObjetMem est toujours null et donc tu ne peux pas appeler GetObjetThread() dessus.

  6. #6
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Avant de me reprendre la tete dans mon code, j'ai besoin d'une petite précision.

    Peut on créer dans une classe un objet, et ensuite accéder à cet objet depuis une autre classe.

    Ex en pseudo code:

    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
     
    ==============
    Classe1 
    new ObjetClasse2
    ==============
     
    ============
    ObjetClasse2
    variables interessantes
    ==============
     
    ============
    Classe3
    //je veux acceder a mes variables
    ObjetClasse2.GetVariablesInteressantes
    =============
    D'avance merci de vos réponses.

  7. #7
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    pas si ce sont des membres d'instances mais avec des membres de classes tu pourrais.

    sinon tu as vraiment besoin de travailler avec des membres d'instance, tu peux dans ta classe 2 stocker des references vers les instances de cette classe et les recupérer depuis ta classe 3 :

    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
    42
    43
    44
    45
    46
    47
    public class Classe1 {
        public Classe1() {
            Classe2 classe2 = new Classe2();
            classe2.setVar(23);
        }
    }
     
    public class Classe2 {
     
        public Classe2(){
            Classe2.instance = this;        
        }
     
        private int var = 13;
     
        public int getVar(){
            return this.var;
        }
     
        public void setVar(int var){
            this.var = var;
        }
     
        private static Classe2 instance = null;
     
        public static Classe2 getInstance() throws Exception{
            if (Classe2.instance == null){
                //leve une exception si pas d'instance de Classe2
                throw new Exception("pas d'inxtance de Classe2");
            }
            return Classe2.instance;
        }
    }
     
    public class Classe3 {
        public static void main(String[] args) {
            //appel au constructeur de Classe1 qui cree l'instance de Classe2 et modifie var
            new Classe1();
            try{
                //affiche le contenu de var de l'instance de classe2
                System.out.println(Classe2.getInstance().getVar());
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

  8. #8
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Merci bien de la réponse, c'est une réponse bien claire, je vais pouvoir modifier mon code en conséquence. Mais jusqu'à présent je n'avais pas trouvé beaucoup d'infos sur ce sujet. Pourtant il me semble important pour exploiter le langage que des objets puissent dialoguer entre eux.
    Ce code est peut être à mettre dans la FAQ ?

  9. #9
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    ce qui marche bien quand tu as besoin de recupérer des ref vers des instances d'objets-clé pour ton appli c'est de créer une classe qui les stockent ces references et accessible en static.

    Le seul truc a pensé est de mettre a jour ces ref quand tu crées les instances en question.

    ravi d'avoir pu t'aider en tout cas

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

Discussions similaires

  1. Assignation objet sans pointeur
    Par jeremm dans le forum C#
    Réponses: 3
    Dernier message: 03/12/2012, 20h35
  2. Pointeur NULL sans l'être
    Par Sleeping Lionheart dans le forum Langage
    Réponses: 12
    Dernier message: 22/03/2010, 14h20
  3. Réponses: 7
    Dernier message: 13/09/2009, 10h00
  4. Liste chaînée sans pointeur
    Par lyes312 dans le forum Langage
    Réponses: 19
    Dernier message: 21/06/2008, 18h39
  5. Liste déroulante sans valeurs nulles
    Par ploxien dans le forum Excel
    Réponses: 1
    Dernier message: 04/07/2007, 15h04

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