2010-11-08 67 views
1

當我試圖從結構中返回值時,遇到「空引用異常」。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 = false一個子項進行初始化。在檢查文件存在後,我使用流讀取器逐個讀取文件的行,直到找到特定的行並停止。問題是當它檢查文件是否存在並且沒有找到特定的行時。即使強硬也會返回null我將項初始化爲false,並在找不到該行時將其設置爲false。注意:這種情況很少發生,在我讀取其他文件時甚至在它返回null的同一文件中工作正常。

注意:我遇到的另一個問題是它跳過它讀取的一行。

這可能是什麼原因造成的?

+0

這只是一個提示,是不相關的問題的方法:你可以通過做牛逼消除在最後幾行他的'item.modified =找到;' – Dinah 2010-11-09 03:26:59

回答

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 2010-11-08 09:42:18

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();