La référence d'objet n'est pas définie à une instance d'un objet [Résolu]

Messages postés
40
Date d'inscription
lundi 14 mai 2012
Statut
Membre
Dernière intervention
8 août 2012
- - Dernière réponse : haddreezy
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Statut
Membre
Dernière intervention
8 août 2012
- 23 mai 2012 à 16:58
Bonjour,

j'ai écrit un programme en c# pour un projet, il a l'air de correctement fonctionner mais j'ai toujours la même phrase à la fin dans ma fenêtre console "la référence d'objet n'est pas définie à une instance d'un objet". Pourtant je n'ai aucune erreur de détecter. Pouvez me dire comment faire pour me débarrasser de cette phrase, surtout si aucune erreur ne lui correspond? Je vous montre mon code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Text.RegularExpressions;
using System.Collections;
using System.IO;






namespace Test7
{
class Class1
{
// Fonction qui calcule la distance entre le récepteur et les points d'accès Wifi
public static double CalculDistance(double P)
{
double h;
double k;
double l;
double m;

k = Math.Pow(10, (P / 10) - 3);
l = 1.25 / (4 * Math.PI);
m = 0.1 * 11 * 11;


h = l/(Math.Sqrt(k/m));
return h;

}

/* Fonction qui calcule les coordonnées du récepteur
public static List<double> CalculPosition(double a, double b, double c, double d, double f, double g, double l, double m, double n, double o, double p, double q)
{
List<double> C = new List<double>();
double x, y, z;

// Math.Pow((x - a), 2) + Math.Pow((y - b), 2) + Math.Pow((z - c), 2) = Math.Pow(o, 2);
//Math.Pow((x - d), 2) + Math.Pow((y - f), 2) + Math.Pow((z - g), 2) = Math.Pow(p, 2);
//Math.Pow((x - l), 2) + Math.Pow((y - m), 2) + Math.Pow((z - n), 2) = Math.Pow(q, 2);

// C.Insert(0, x);
// C.Insert(1, y);
//C.Insert(2, z);

return C;
}


*/
















[STAThread]
static void Main(string[] args)
{
try
{

// Création d'une instance de document xml et chargement des données.

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Documents and Settings\8907840K\Mes documents\Visual Studio 2010\Projects\Tets7\Tets7\bin\Debug\Summary.kml");

// 1. Sélectionne tous les noeuds descriptions en utilisant un chemin.

XmlNodeList nodeList = doc.SelectNodes("//Folder/Folder/Placemark/description");
XmlNode node;
Console.WriteLine("{0}", "Acces_Points LIST: ");
Console.WriteLine("{0}", "----------------- ");


// 2. Déclaration des variables

string s1;
TimeSpan ts = TimeSpan.Zero;
StreamWriter monStreamWriter = new StreamWriter(@"C:\Documents and Settings\8907840K\Bureau\Test\test.txt");
double[] array = new double[3];
double[] AP1 = new double[3];
double[] AP2 = new double[3];
double[] AP3 = new double[3];
List<double> Coordonnées = new List<double>();
array[0] = array[1] = array[2] = 0;
double puissance2 = 0;
int i = 0;
int j = 0;
double diff = 0;
double d1, d2, d3;
string lo, la, al;
double lon, lat, alt;




// 3. Extraction des informations recherchées

foreach (XmlNode nd in nodeList)
{

s1 = nd.InnerText;

// Nom des APs

string pattern = @"(?<Nom>([A-Za-z0-9 \-_\[\]]+ \[[0-9A-Z:]+\]))";
Regex searchRegEx = new Regex(pattern);
Match correspondance = searchRegEx.Match(s1);
string nom = correspondance.Groups["Nom"].Value;

// Puissance des APs

string pattern1 = @"(?(\-[0-9]+dBm))";
Regex searchRegEx1 = new Regex(pattern1);
Match correspondance1 = searchRegEx1.Match(s1);
string puissance = correspondance1.Groups["Puissance"].Value;
string puissance1 = puissance.Substring(0, 3);
puissance2 = Convert.ToDouble(puissance1);
//Console.Write(puissance2);
//Console.Write("\n");



// Coordonnées GPS

string pattern2 = @"(?<Coordonnées>([\-]?[0-9]+,[\-]?[0-9]+,[\-]?[0-9]+))";
Regex searchRegEx2 = new Regex(pattern2);
Match correspondance2 = searchRegEx2.Match(s1);
string coordonnées = correspondance2.Groups["Coordonnées"].Value;
string[] position = coordonnées.Split(new Char[] { ',' });
la = position[0];
lo = position[1];
al = position[2];
lon = Convert.ToDouble(lo);
lat = Convert.ToDouble(la);
alt = Convert.ToDouble(al);



//Console.Write("{0}, {1}, {2}", lo, la, al);




// Temps

string pattern3 = @"(?<Temps>([0-9]+:[0-9]+:[0-9]+.[0-9]+Z))";
Regex searchRegEx3 = new Regex(pattern3);
Match correspondance3 = searchRegEx3.Match(s1);
string temps = correspondance3.Groups["Temps"].Value;


// Création échelle de temps

string temps1 = temps.Substring(0, 12);
DateTime h = DateTime.ParseExact(temps1, "HH:mm:ss.fff", null);
TimeSpan h1 = h.TimeOfDay;
if (ts == TimeSpan.Zero)
{

double d = ts.TotalMilliseconds;
// Ecriture dans fichier texte
monStreamWriter.WriteLine(string.Format("{0},{1},{2},{3}", nom, puissance1, coordonnées, d));
array[0] = puissance2;
AP1[0] = lat;
AP1[1] = lon;
AP1[2] = alt;
i = i + 1;






/* Console.Write(d);
Console.Write("\n");*/
ts = h1;


}
else
{

TimeSpan h2 = h1.Subtract(ts);
double e = h2.TotalMilliseconds;


// Ecriture dans fichier texte
monStreamWriter.WriteLine(string.Format("{0},{1},{2},{3}", nom, puissance1, coordonnées, e));
if (i < 3)
{
if (i == 1)
{

array[i] = puissance2;
AP2[0] = lat;
AP2[1] = lon;
AP2[2] = alt;


diff = e;
i = i + 1;
}
else
{
array[i] = puissance2;
AP3[0] = lat;
AP3[1] = lon;
AP3[2] = alt;
diff = e;
i = i + 1;
}

}

if (array[0] != 0 && array[1] != 0 && array[2] != 0)
{
while (j < 1)
{
d1 = CalculDistance(array[0]);
d2 = CalculDistance(array[1]);
d3 = CalculDistance(array[2]);
// Coordonnées = CalculPosition(AP1[0], AP1[1], AP1[2], AP2[0], AP2[1], AP2[2], AP3[0], AP3[1], AP3[2], d1, d2, d3);
j = j + 1;
Console.Write("{0}, {1}, {2}", d1, d2, d3);

}
}

if (i > 2 && diff != e)
{
array[1] = array[2] = 0;
j = 0;
array[0] = puissance2;
AP1[0] = lat;
AP1[1] = lon;
AP1[2] = alt;
AP2 AP3 null;
i = 1;

}

/* Console.Write(e);
Console.Write("\n");*/
}



}


monStreamWriter.Close();




XmlElement root = doc.DocumentElement;
node = root.ChildNodes[1].ChildNodes[1].ChildNodes[1];






}
catch (XmlException xmlEx) // Handle the XML Exceptions here.
{
Console.WriteLine("{0}", xmlEx.Message);
}
catch (Exception ex) // Handle the Generic Exceptions here.
{
Console.WriteLine("{0}", ex.Message);
Console.ReadLine();
}
}
}

}

Merci pour votre aide
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
23
1
Merci
Bonjour,

Ce message correspond à une NullReferenceException : Tu accèdes à un membre d'un objet qui est null.

Pour savoir de quel objet il s'agit et à quelle ligne, il faut enlever le
catch (Exception ex)
{

}


Ensuite, sache qu'un try / catch sur l'intégralité d'une méthode, c'est mal. C'est le meilleur moyen d'avoir une méthode qui ne marche pas sans que tu le voies ou un comportement anormal.

Les try / catch sont là pour gérer les exceptions, et doivent être utilisés de manière exceptionnelle.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Dire « Merci » 1

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

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de krimog
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Statut
Membre
Dernière intervention
8 août 2012
2
1
Merci
Mon problème vient de cette ligne: "node = root.ChildNodes[1].ChildNodes[1].ChildNodes[1]; " l'élément node est défini juste au dessus par "XmlNode node;" . Dois je l'initialiser pour éviter qu'il soit null? Comment faire dans ce cas? Ou celà vient d'autre chose que de l'initilaisation?

Dire « Merci » 1

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

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de haddreezy
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
23
1
Merci
Comme je le disais, c'est que tu essaies d'accéder à un membre d'un élément qui est null. Autrement dit que ce que tu as avant un "." est null.

Si le problème est à la ligne "node = root.ChildNodes[1].ChildNodes[1].ChildNodes[1];", voici ce qui peut être null :
- root
- ChildNodes[1] (orange)
- ChildNodes[1] (violet)

En mode debug, tu peux sélectionner root, root.ChildNodes[1] ou root.ChildNodes[1].ChildNodes[1], plus faire clic-droit → Add Watch (ajouter un observateur ou quelque chose comme ça en français).
Tu verras ainsi la valeur de ton élément (donc tu verras s'il est null).

Mais plus simplement : est-ce normal que tu ailles à l'indice 1 (alors que le premier indice est 0) ? Est-ce que ça ne devrait pas plutôt être root.ChildNodes[0].ChildNodes[0].ChildNodes[0]; ?

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Dire « Merci » 1

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

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de krimog
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Statut
Membre
Dernière intervention
8 août 2012
2
1
Merci
C'est bon j'ai réussi à résoudre mon problème. Je pensais en effet que ChildNodes[1] me renverrait au premier enfant du 1er noeud de mon texte, or il renvoie au premier noeud tout court. Du coup c'est ChildNodes[1] qui était nul.
J'ai donc remplacé mon expression par :

XmlElement root = doc.DocumentElement;
XmlNode node1, node2, node3, node4, node5;
node1 = root.ChildNodes[0];
node2 = node1.ChildNodes[1];
node3 = node2.ChildNodes[1];
node4 = node3.ChildNodes[1];
node5 = node4.ChildNodes[3];

Merci encore pour tout.

Dire « Merci » 1

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

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de haddreezy
Messages postés
224
Date d'inscription
vendredi 26 novembre 2010
Statut
Membre
Dernière intervention
11 juin 2013
2
0
Merci
Bonjour,

alors je n'ai pas lu tout le code mais, cette erreur signifie que le code essaie d'utiliser un objet/variable/... qui n'ai pas été instancié.
Le mieux serait de faire un pas à pas sur l’exécution pour connaitre la ligne qui génère l'erreur.
Commenter la réponse de cs_L0ci
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Statut
Membre
Dernière intervention
8 août 2012
2
0
Merci
Mon problème vient de l'instruction: "catch (Exception ex)", donc de l'objet ex mais je ne sais pas du tout comment résoudre l'erreur, je débute en c#. Quelqu'un pourrait me venir en aide?
Commenter la réponse de haddreezy