2010-11-08 71 views
1

Je rencontre une "exception de référence nulle" lorsque j'essaie de renvoyer une valeur à partir d'une structure.Exception de référence Null dans C#

est le code ici:

AssetItem item = new AssetItem(); 

     item = initModified(); 

     bool found = false; 
     int index = getIndex(barcode); 
     string modifiedFile = filepath + "Modified\\" + dir + "\\" + index + ".asdt"; 

     if(File.Exists(modifiedFile)) 
     { 
      using(StreamReader reader = new StreamReader(modifiedFile)) 
      { 
       string line = reader.ReadLine(); 
       while(line.Trim()!="") 
       { 
        string[] split = line.Split(','); 
        if(split[1]==barcode) 
        { 
         found = true; 
         break; 
        } 
        line = reader.ReadLine(); 
       } 
       reader.Close(); 
      } 
     } 

     if(found) 
     { 
      item.modified = true; 
     } 
     else 
     { 
      item.modified = false; 
     } 


     return item; 

J'initialise point en appelant un sous contenant que item.modified = false. Après avoir vérifié que le fichier existe, j'ai utilisé un streamreader pour lire les lignes du fichier une à une jusqu'à ce qu'il trouve une ligne spécifique et s'arrête. Le problème est lorsqu'il vérifie si le fichier existe et ne trouve pas la ligne spécifique. Il retourne null même difficile J'initialise l'item à false et le mets à false quand il ne trouve pas la ligne. Remarque: cela se produit rarement et fonctionne correctement lorsque j'accède à d'autres fichiers à lire et même dans le même fichier que celui-ci renvoie null.

Remarque: Un autre problème que j'ai rencontré est qu'il saute une ligne qu'il lit.

Quelle est la cause de ceci?

+0

Ceci est juste une pointe et est sans rapport avec votre problème: vous pouvez éliminer quelques lignes à la fin en faisant t son 'item.modified = found;' – Dinah

Répondre

7

Et la fin du fichier, ReadLine() renvoie null - et vous appelez alors .Trim() dessus sans vérifier (dans le scénario où l'article n'est pas là et vous lisez le fichier tout au long) - d'où vous devez ajouter un nul contrôle (note aussi je l'ai déplacé le ReadLine il arrive toujours):

using(StreamReader reader = new StreamReader(modifiedFile)) 
{ 
    string line; 
    while((line = reader.ReadLine()) != null && line.Trim() != "") { 
     ... 
    } 
} 

Notez que le code ci-dessus (basé sur le vôtre) prendra fin à la première ligne vide; Personnellement, je serais probablement sauter lignes vides:

using(StreamReader reader = new StreamReader(modifiedFile)) 
{ 
    string line; 
    while((line = reader.ReadLine()) != null) { 
     if(line.Trim() == "") continue; 
     ... 
    } 
} 
+0

@Mark Gravell - Merci, ça marche bien maintenant après vérification avec les fichiers auxquels j'ai accédé. – gibz357

1

Un problème que je peux trouver dans votre code est que vous n'avez pas besoin de la ligne suivante: fait automatiquement

reader.Close(); 

using pour cette toi.

En outre, votre condition de boucle doit vérifier EndOfStream au lieu de couper la ligne.

-à-dire, la modification du code à quelque chose comme ceci:

using(StreamReader reader = new StreamReader(modifiedFile)) 
{ 

    while(!reader.EndOfStream) 
    { 
     string line = reader.ReadLine(); 
     string[] split = line.Split(','); 
     if(split[1]==barcode) 
     { 
      found = true; 
      break; 
     } 
    } 
} 
0

Sur une note côté, pourquoi créer une nouvelle instance puis re-lui assigner sans l'utiliser à des fins ..

AssetItem item = new AssetItem(); 
item = initModified(); 

pourrait devenir

AssetItem item = initModified();