2013-04-22 62 views
3

我正在製作一個函數,它將從StreamReader中獲取不包含註釋(以'//'開頭的行)和新行的行數。StreamReader NullReferenceException

這是我的代碼:

private int GetPatchCount(StreamReader reader) 
    { 
     int count = 0; 

      while (reader.Peek() >= 0) 
      { 
       string line = reader.ReadLine(); 
       if (!String.IsNullOrEmpty(line)) 
       { 
        if ((line.Length > 1) && (!line.StartsWith("//"))) 
        { 
         count++; 
        } 
       } 
      } 

     return count; 
    } 

我的StreamReader的數據是:

// Test comment 

但我發現了一個錯誤,「不設置到對象的實例對象引用」。有沒有辦法解決這個錯誤?

編輯 原來這發生在我的StreamReader爲空時。所以用musefan和史密斯先生的建議代碼,我想出了這個:

private int GetPatchCount(StreamReader reader, int CurrentVersion) 
    { 
     int count = 0; 
      if (reader != null) 
      { 
      string line; 
      while ((line = reader.ReadLine()) != null) 
       if (!String.IsNullOrEmpty(line) && !line.StartsWith("//")) 
        count++; 
      } 
     return count; 
    } 

感謝您的幫助!

+0

什麼是堆棧跟蹤? – SLaks 2013-04-22 15:16:14

+0

你有調試過嗎?你可以很容易地斷點並確定什麼*確切*是'null'。 – Arran 2013-04-22 15:16:33

+2

嗯,我想你的StreamReader是空... – MUG4N 2013-04-22 15:17:03

回答

1

沒有必要Peek(),這實際上可能是問題太多。你可以這樣做:

string line = reader.ReadLine(); 
while (line != null) 
{ 
    if (!String.IsNullOrEmpty(line) && !line.StartsWith("//")) 
    { 
     count++; 
    } 
    line = reader.ReadLine(); 
} 

當然,如果你StreamReader爲null,則你有問題,但僅憑你的示例代碼不足以確定此 - 你需要調試。應該有足夠的調試信息來確定哪個對象實際上是空的

+0

哦,你說得對。這發生在我的StreamReader爲空時。謝謝! – CudoX 2013-04-22 15:42:51

1

聽起來像你reader對象是null

您可以檢查如果讀者是在做無效:

if (reader == null) { 
    reader = new StreamReader("C:\\FilePath\\File.txt"); 
} 
+0

返回堆棧上;) – mattytommo 2013-04-22 20:03:00

+0

@mattytommo老闆關了;) – 2013-04-23 07:25:51

1

musefan的建議代碼略微整齊一些;只有一個ReadLine()代碼。 +1建議刪除長度檢查btw。

private int GetPatchCount(StreamReader reader) 
{ 
    int count = 0; 
    string line; 
    while ((line = reader.ReadLine()) != null) 
     if (!String.IsNullOrEmpty(line) && !line.StartsWith("//")) 
      count++; 
    return count; 
} 
0

您的代碼沒有足夠的信息來解決您的問題。我已經用VS 2010做了一個小應用,基於我的假設,它運行良好。我相信你的代碼在streamReader中遇到問題。如果streamReader爲null,則代碼將拋出「未將對象引用設置爲對象的實例」。 您應該檢查streamReader是否爲空,並確保streamReader可用。

您可以參考下面的代碼。確保D:\ 上存在的TextFile1.txt希望得到這個幫助。

namespace ConsoleApplication1 
{ 
using System; 
using System.IO; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (StreamReader streamReader = new StreamReader(@"D:\\TextFile1.txt")) 
     { 
      int count = GetPatchCount(streamReader); 
      Console.WriteLine("NUmber of // : {0}", count); 
     } 

     Console.ReadLine(); 
    } 

    private static int GetPatchCount(StreamReader reader) 
    { 
     int count = 0; 

     while (reader.Peek() >= 0) 
     { 
      string line = reader.ReadLine(); 
      if (!String.IsNullOrEmpty(line)) 
      { 
       if ((line.Length > 1) && (!line.StartsWith("//"))) 
       { 
        count++; 
       } 
      } 
     } 

     return count; 
    } 
} 
}