NullReferenceException: La référence d'objet

Fermé
cutpan Messages postés 6 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 13 février 2011 - 13 févr. 2011 à 13:04
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 févr. 2011 à 15:47
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

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 13/02/2011 à 13:35
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
cutpan Messages postés 6 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 13 février 2011
13 févr. 2011 à 14:31
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
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 13/02/2011 à 14:49
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
0
cutpan Messages postés 6 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 13 février 2011
13 févr. 2011 à 15:07
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
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 13/02/2011 à 15:19
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);   
  }   
}
0
cutpan Messages postés 6 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 13 février 2011
13 févr. 2011 à 15:26
l'affichage c'est
j=1/ 5
j=2/5
j=3/ 5
j=4/5
j=5/5
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 13/02/2011 à 15:37
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...
0

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

Posez votre question
cutpan Messages postés 6 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 13 février 2011
13 févr. 2011 à 15:42
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();
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 13/02/2011 à 15:52
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);  
  ... 
}
0