2011-03-15 73 views
1

我试图让列表的一维数组。我做这样的:数组列表中抛出的NullReferenceException

public static List<string>[] words = new List<string>[30]; 
public static List<string>[] hints = new List<string>[30]; 

我这样称呼它:

foreach (string item in vars.directory) 
     { 
      reader2 = new StreamReader(item); 
      while (reader2.Peek() > 0) 
      { 
       string line = reader2.ReadLine(); 
       if (line.StartsWith("#")) 
       { 
        vars.words[counter].Add(line.Substring(1, line.Length - 1)); //here 
       } 
       else if (line.StartsWith("-")) 
       { 
        vars.hints[counter].Add(line.Substring(1, line.Length - 1)); //another here 
       } 
       else if (line == "@end") 
       { 
        counter++; 
       } 
      } 
     } 

我只是想补充一点,瓦尔在这里我把我的公共变量和计数器的确是在0时循环开始。

编辑 在我匆忙我忘了补充问题......哎呀......

这就是:当我调用add函数(或任何与此有关的另一个功能),它返回一个空引用异常。我怎样才能解决这个问题?

+5

问题是什么? – 2011-03-15 19:56:04

+0

对不起...当我调用add函数时,它返回一个空引用异常。 – 2011-03-15 19:58:15

+0

见http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net – 2011-03-15 20:27:59

回答

7

我假设你试图调用.Add您的数组元素时崩溃。你需要用有效的对象初始化你的数组。

for(Int32 i = 0; i < vars.words.Length; ++i) 
    vars.words[i] = new List<string>(); 
for(Int32 i = 0; i < vars.hints.Length; ++i) 
    vars.hints[i] = new List<string>(); 
+1

由于'words'和'hints'是数组,你应该使用,而不是'Count'的'Length'财产方法。 – 2011-03-15 20:01:13

+0

我总是想知道这件事,是否有一种“正常”的方式来初始化所有的数组? – OopsUser 2011-03-15 20:01:21

+0

我把它和我得到:运算符'<'不能应用于类型'int'和'方法组'的操作数。我应该用长度替换计数吗? – 2011-03-15 20:02:32

6

为什么不只是做一个List<List<string>>,但肯定可以让列表

数组
0

你使用他们的权利之前,你可以初始化列表:

foreach (string item in vars.directory) 
{ 
    reader2 = new StreamReader(item); 
    while (reader2.Peek() > 0) 
    { 
     string line = reader2.ReadLine(); 
     // new code 
     if (vars.words[counter] == null) vars.words[counter] = new List<string>(); 
     if (vars.hints[counter] == null) vars.hints[counter] = new List<string>(); 

     if (line.StartsWith("#")) 
     { 
      vars.words[counter].Add(line.Substring(1, line.Length - 1)); //here 
     } 
     else if (line.StartsWith("-")) 
     { 
      vars.hints[counter].Add(line.Substring(1, line.Length - 1)); //another here 
     } 
     else if (line == "@end") 
     { 
      counter++; 
     } 
    } 
} 
+0

他可能有多个单词或提示存储在每个列表中,因此每个初始化程序只有在元素为空时才需要运行。 – Avilo 2011-03-15 20:10:00

+0

@Avilo。接得好。我修复了它。 – 2011-03-15 21:46:39

0

这里是一个一行来初始化大小30列表的数组:

static List<string>[] lists = (from i in Enumerable.Range(0, 30) 
            select new List<string>()).ToArray(); 
2

使用列表正如已经建议的那样,列表会让你摆脱你的问题,并且它比你的建筑更加灵活和方便。

- > f.i.如果数据大小发生更改,则不必更改列表大小,但是阵列

0

问题是数组值被初始化为默认值,而引用类型的默认值为null

default(List<string>)回报null

所以,你需要在阵列中重新初始化对象之前,你可以访问它们,否则你将得到一个NullReferenceException

一来初始化数组前面的所有对象的方法是使用LINQ的语句:

const int sizeOfLists = 5; 
List<string>[] lists = Enumerable.Range(0, sizeOfLists) 
    .Select(i => new List<string>()) 
    .ToArray(); 

另一种选择是只初始化并添加子列表,当你需要的时候,通过使用外部列表:

var lists = new List<List<string>>(); 
// ... 
var aSubList = new List<string>(); 
lists.Add(aSubList); 

这是特别有用的,如果你不知道外组名单上前面的大小,仍然是指数接近。

(这是一个注释之前,但我做到了这一个答案,因为很多其他的答案中得到了解决方案很感兴趣,并没有说明问题)

相关问题