2010-11-08 9 views
1

Я испытываю «исключение ссылочной ссылки», когда пытаюсь вернуть значение из структуры.Исключение Null Reference в C#

вот код:

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; 

Я инициализировать элемент вызвав саб, содержащий, что item.modified = ложь. После проверки того, что файл существует, я использовал streamreader для чтения строк файла один за другим, пока не найдет определенную строку и не остановится. Проблема в том, когда он проверял, существует ли файл и не находит конкретную строку. Он возвращает null даже жестко. Я инициализирую элемент false и устанавливаю его в false, когда он не находит строку. Примечание: это происходит редко и отлично работает, когда я получаю доступ к другим файлам для чтения и даже в том же файле, что и null.

Примечание. Еще одна проблема, с которой я столкнулся, заключается в том, что она пропускает строку, которую она читает.

Что может быть причиной этого?

+0

Это только наконечник и не имеет никакого отношения к вашей проблеме: вы можете устранить некоторые строки в конце, делая т его 'item.modified = found;' – Dinah

ответ

7

И конец файла, ReadLine() возвращает null - и вы тогда вызываете .Trim() на нем без проверки (в том случае, когда элемент отсутствует, и вы читаете файл полностью) - отсюда вам нужно добавить нуль-чек (примечание также я переехал ReadLine так это происходит последовательно):

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

Обратите внимание, что приведенный выше код (на основе вашей) закончится на первой пустой строке; лично я бы, вероятно, пропустить пустые строки:

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

@Mark Gravell - Спасибо, теперь он отлично работает после проверки с файлами, к которым я обращался. – gibz357

1

Одна проблема, которую я могу найти в своем коде, что вам не нужно следующую строку:

reader.Close(); 

using автоматически делает это для вы.

Кроме того, ваше условие петли должно проверять EndOfStream вместо обрезки линии.

т.е. изменить код, чтобы что-то вроде этого:

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

На стороне записки, почему создать новый экземпляр затем повторно назначить ему без его использования для любых целей ..

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

может стать

AssetItem item = initModified(); 
Смежные вопросы