2011-11-20 51 views
1
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异常没有处理

NullReferenceException was not handled

+0

你想做什么? –

+0

文本文件中有两种类型的行,1.没有空格开始,2.以空格开始,我将它们中的每一个都存储在一个数组中。例如, 第一行 我属于FIRSTLINE,马克 我属于FIRSTLINE,乔伊 下联 我属于二线,马克 我属于二线,乔伊 寻找, 阵列[0] =>首先行 我属于第一线,马克 我属于第一线,欢乐 array [1] =>第二行 我属于二线,马克 我属于二线,喜悦 – CodeLive

+0

我不明白。也许你可以用缺少的信息来更新问题,而不是将它写在评论中?然后你可以使用格式来使描述更清晰,希望(!)它会更有意义。 –

回答

4

你初始化mainAndSublines为null。

如果你事先知道所需的大小使用:

string[] mainAndSublines = new string[100]; 

如果你不知道你事先想要的大小,使用动态调整大小的容器如List:

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

列表是最合适的解决方案 – abatishchev

+1

''实际上,他*已*初始化'mainAndSublines'为一个值,显式 - 空值。它仍然是一个值:)'' –

+0

乔恩:他已经赋值给变量,但没有将它初始化为一个数组,对吗? – abatishchev

0

您还需要初始化第二个数组,就像您对第一个数组进行初始化操作一样,大小可能相等。

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

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

1

很简单,因为你的阵列mainAndSublines为空,你不能访问数组是空的元素...

1

实际上,你已经来到这里问题 - 一个是,你试图将值设置为空数组,另一个是如何查找该行的第一个字符是否为空格。

我会用非空间启动线List<String>,因为你不能告诉多少会有,但此时你假设每线将非空。幸运的是,使用StartsWith修复此问题很容易。

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

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

在.NET 4中,你可以使这个更多的内存有效使用File.ReadLines而不是File.ReadAllLines - 此流将文件流式传输,而不是将所有内容加载到内存中。