NullReferenceException: La référence d'objet [Fermé]

Signaler
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011
-
Messages postés
16191
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
-
Bonjour,

Je développe une application en c# et j'ai depuis quelques temps le message d'erreur suivant: [NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.]
J'ai une classe Element et classe Problem
voici mon code:
""
Problem[] tab = new Problem[100];
tab = files(); // la méthode files() donne commen résulatat un tableau de type Problem

Element[] T = new Element[100];
T = tab[0].getElements(); // donne un tableau de type Element

for (int j=1; j<T.Length-1; j++)
{
Element eleme;
eleme= new Element();
eleme.setWidth( T[j].getWidth()); // chaque element a un width
eleme.setHeight(T[j].getHeight()); chaque element a un height

int x = eleme.getWidth();
int y = eleme.getHeight();
int i = j-1;
Element elem = T[i];

while (i >= 0 && ((elem.getWidth() < x) || ((elem.getWidth() == x) && (elem.getHeight() < y))))
{
Element elem1 = T[i+1];

elem1.setWidth(elem.getWidth());
elem1.setHeight(elem.getHeight());
i = i-1;
}

}
""

J'ai bien instancié tout les objets et j'ai pas compris comment résoudre ce problème
Merci bien d'avance

5 réponses

Messages postés
16191
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 776
Je ne connais pas le C# mais bon je pense pouvoir t'aider quand même, car tous ces langages objets se ressemblent un peu...
Je pense que tes eleme et elem1 ne servent à rien vu le code que tu nous donnes.
En effet dans ta boucle while, tu devrais mettre directement T[i] pour le faire varier sinon ta boucle ne remonte pas les informations une à une, mais propage T[j-1]...

for (int j=1; j<T.Length; j++)   
{  
  int xj = T[j].getWidth();  
  int yj = T[j].getHeight();  

  for (int i=j-1; i >= 0; i--)  
  {  
    int xi = T[i].getWidth();  
    int yi = T[i].getHeight();  

    if (xi>xj || (xi==xj && yi>=yj))  
      break;  

    T[i+1].setWidth(xj);  
    T[i+1].setHeight(yj);  
  }  
}

La confiance n'exclut pas le contrôle
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011

Merci bien pour votre réponse

En fait j'ai essayé votre proposition mais malheureusement j'ai eu la meme erreur et c'est pour l'instruction : int xj = T[j].getWidth();
j'ai pas compris pourquoi j'ai l'erreur NullReferenceException
Messages postés
16191
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 776
Trouve moi pour quelle valeur de j cela plante. Et donne moi aussi la valeur de T.Length...
Par exemple en faisant un affichage sur la ligne juste avant celle qui plante.

À mon avis, tu vas obtenir 100 pour T.length, et pour j tu vas avoir le nombre d'éléments de ton files et ce ne seront pas les mêmes...
Dans ce cas il faudra rajouter dans ta boucle quelquechose du genre &&T[j]!=NULL
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011

T.Lengh= 5
il comprends 5 objet de type Element
chaque objet a deux propriétés width et height voici les 5 objets
obj1:width= 3 et height= 7
obj2:width= 8 et height= 1
obj3:width= 10 et height= 2
obj4:width= 5 et height= 4
obj5:width= 2 et height= 1
Mon objectif est de trier le tableau T dans l'ordre décroissants en se basant sur width des elements et dans le cas ou on a la meme valeur de width alors le tri sera en se basant sur height


public void sort ( )
{
Problem[] tab = new Problem[100];
tab = files();

Element[] T = new Element[100];
T = tab[0].getElements();

for (int j=1; j<T.Length-1; j++)
{
int x = T[j].getWidth();
int y = T[j].getHeight();
int i = j-1;

while (i >= 0 && ((T[i].getWidth() < x) || ((T[i].getWidth() == x) && (T[i].getHeight() < y))))
{ {
T[i] = T[i+1];


Console.WriteLine("dddd" + T[i].getWidth()+ T[i].getHeight());


i = i-1;
}

T[i + 1].setWidth(x);
T[i + 1].setHeight(y);
Console.WriteLine(" zzz" + T[i + 1].getWidth() + T[i + 1].getHeight());
Console.ReadLine();
}

voici l'affichage
dddd 8 1
zzz 8 1
dddd 10 2
dddd 10 2
zzz 10 2
zzz 5 4
zzz 2 1

Puis l'affichage de l'erreur
Messages postés
16191
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 776
En fait ce qu'il m'intéresserait pour t'aider c'est l'affichage de ceci :

for (int j=1; j<T.Length; j++)    
{ 
  Console.WriteLine("j="+j+"/"+T.Length); 

  int xj = T[j].getWidth();   
  int yj = T[j].getHeight();   

  for (int i=j-1; i >= 0; i--)   
  { 
    int xi = T[i].getWidth();   
    int yi = T[i].getHeight();   

    if (xi>xj || (xi==xj && yi>=yj))   
      break;   

    T[i+1].setWidth(xj);   
    T[i+1].setHeight(yj);   
  }   
}
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011

l'affichage c'est
j=1/ 5
j=2/5
j=3/ 5
j=4/5
j=5/5
Messages postés
16191
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 776
C'est étonnant que j aille jusqu'à 5 alors qu'on lui dit de ne continuer que pour j<5 !
Mais l'erreur est bien ici, puisque que T[5] n'existe pas, T[5].getWidth() génère une exception.

C'est totalement stupide, mais rajoute une instruction if (j>=T.Length) break; juste avant la commande d'affichage...
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011

j=1/ 100
j=2/100
j=3/ 100
j=4/100
j=5/100
Mais l'erreur reste encore pour l'instruction : int xj = T[j].getWidth();
Messages postés
16191
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 776
Ah bah cet affichage me plaît mieux ;-)
Comme je le pensais T.Length est égal à 100, la taille d'allocation mémoire.
Or toi tu ne veux l'utiliser que jusqu'à 5, puisque c'est ton nombre de données.

Donc comme je le précisais plus haut, il faut que tu rajoutes une condition pour t'arrêter quand il n'y a plus de données :

for (int j=1; j<T.Length && T[j]!=null; j++)     
{  
  Console.WriteLine("j="+j+"/"+T.Length);  
  ... 
}