获取错误:未处理NullReferenceException

时间:2011-11-20 08:26:06

标签: c# .net exception-handling nullreferenceexception

string filename = o.FileName;
string[] textlines = File.ReadAllLines(filename);
string[] mainAndSublines = null;
int i = 0;

foreach(string textline in textlines)
{
   if (textline.Substring(0, 1) != " ")
   {
      i++;
   }

   mainAndSublines[i] = textlines[i];   //Getting error, NullReferenceException was not handled
}

我收到了错误:

  

未处理NullReferenceException

4 个答案:

答案 0 :(得分:4)

您已将mainAndSublines初始化为null。

如果您事先知道所需的尺寸,请使用:

string[] mainAndSublines = new string[100];

如果您事先不知道所需的大小,请使用动态调整大小的容器,例如List:

List<string> mainAndSublines = new List<string>();

答案 1 :(得分:1)

只是因为你的数组mainAndSublines为null而你无法访问一个null的数组元素......

答案 2 :(得分:1)

你实际上在这里遇到了两个问题 - 一个是你试图将值设置为一个空数组,另一个是你是如何尝试查找是否第一个字符这条线是一个空间。

我会使用List<String>作为非太空起跑线,因为你不知道会有多少行,但是你假设每行都会是非空的。幸运的是,使用StartsWith很容易解决这个问题。

如果您使用的是.NET 3.5或更高版本,我然后使用LINQ,这使整个事情真的简单:

List<string> mainAndSublines = File.ReadAllLines(filename)
                                   .Where(x => !x.StartsWith(" "))
                                   .ToList();

在.NET 4中,您可以使用File.ReadLines代替File.ReadAllLines来提高内存效率 - 这会流式传输文件,而不是将整个内容加载到内存中。

答案 3 :(得分:0)

你需要初始化第二个数组,就像你先做的那样,可能等于大小。

string[] mainAndSublines = new string[textlines.Length];

但这里最合适的解决方案是Mark的一个 - 可自动调整大小的容器。