NullReferenceException: La référence d'objet

cutpan Messages postés 7 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
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 19031 Statut Modérateur 3 020
 
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 7 Statut Membre
 
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 19031 Statut Modérateur 3 020
 
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 7 Statut Membre
 
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 19031 Statut Modérateur 3 020
 
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 7 Statut Membre
 
l'affichage c'est
j=1/ 5
j=2/5
j=3/ 5
j=4/5
j=5/5
0
KX Messages postés 19031 Statut Modérateur 3 020
 
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 7 Statut Membre
 
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 19031 Statut Modérateur 3 020
 
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