2012-04-02 61 views
0

我試圖顯示模塊名稱從數組到列表框,但我得到一個"NullReferenceException was unhandled"錯誤。顯示列表框中存儲的每個模塊的名稱

modules.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Modules> 
    <Module> 
    <MCode>3SFE504</MCode> 
    <MName>Algorithms and Data Structures</MName> 
    <MCapacity>5</MCapacity> 
    <MSemester>1</MSemester> 
    <MPrerequisite>None</MPrerequisite> 
    <MLectureSlot>0</MLectureSlot> 
    <MTutorialSlot>1</MTutorialSlot> 
    </Module> 

</Modules> 

Form1.cs的

Modules[] modules = new Modules[16]; 
Modules[] pickedModules = new Modules[8]; 
int modulecounter = 0, moduleDetailCounter = 0; 
while (textReader.Read()) 
{ 
    XmlNodeType nType1 = textReader.NodeType;  
    if ((nType1 != XmlNodeType.EndElement) && (textReader.Name == "ModuleList")) 
    {  
     // ls_modules_list.Items.Add("MODULE"); 
     Modules m = new Modules(); 
     while (textReader2.Read()) //While reader 2 reads the next 7 TEXT items 
     { 
      XmlNodeType nType2 = textReader2.NodeType; 
      if (nType2 == XmlNodeType.Text) 
      { 
       if (moduleDetailCounter == 0) 
        m.MCode = textReader2.Value; 
       if (moduleDetailCounter == 1) 
        m.MName = textReader2.Value; 
       if (moduleDetailCounter == 2) 
        m.MCapacity = textReader2.Value; 
       if (moduleDetailCounter == 3) 
        m.MSemester = textReader2.Value; 
       if (moduleDetailCounter == 4) 
        m.MPrerequisite = textReader2.Value; 
       if (moduleDetailCounter == 5) 
        m.MLectureSlot = textReader2.Value; 
       if (moduleDetailCounter == 6) 
        m.MTutorialSlot = textReader2.Value; 
       // ls_modules_list.Items.Add(reader2.Value); 
       moduleDetailCounter++; 
      } 
      if (moduleDetailCounter == 7) { moduleDetailCounter = 0; break; } 

     } 
     modules[modulecounter] = m; 
     modulecounter++; 
     } 
    } 
    for (int i = 0; i < modules.Length; i++) 
    {      
     ModulesListBox.Items.Add(modules[i].MName); // THE ERROR APPEARS HERE 
    } 
} 

我得到上標有// THE ERROR APPEARS HERE行的錯誤。

+1

嘗試縮小問題範圍,併發布*特定*問題。複製粘貼您的所有代碼並要求人們爲您調試它並不是一種好的方法。 – 2012-04-02 00:07:45

+1

這似乎是'XmlSerializer'處理好得多的東西 – 2012-04-02 00:08:00

+0

@Attila Kal-El Egemensoy:使用'XmlDocument'有什麼限制嗎? – 2012-04-02 00:38:09

回答

0

for循環從0到16,但模塊是隻有0到15,改變modules.length到(modules.length -1

+0

仍然得到相同的錯誤,MName鏈接到我的ModuleList類並被decalared爲「public String MName;」 – 2012-04-02 00:17:31

+0

'<'符號處理modules.length,但他初始化爲16長度,即使他不會全部加載。看到我的答案。 – 2012-04-02 18:12:55

1

要麼ModulesListBox爲null,因爲你訪問它,它被初始化或modules數組包含空之前元素。

就像其中一位評論者說的那樣,您可能最好使用XmlSerializer來將XML加載到模塊集合中。如果這是不可能的,改爲modules改爲List<Modules>

0

幾乎正面的問題是在你的反序列化邏輯的某個地方。人們可以調試它,但爲什麼要重新發明輪子?

var serializer = new XmlSerializer(typeof(List<Module>), new XmlRootAttribute("Modules")); 
using (var reader = new StreamReader(workingDir + @"\ModuleList.xml")) 
    var modules = (List<Module>)serializer.Deserialize(reader); 

這將給予Module小號假設它被定義爲

public class Module 
{ 
    public string MCode; 
    public string MName; 
    public int MCapacity; 
    public int MSemester; 
    public string MPrerequisite; 
    public int MLectureSlot; 
    public int MTutorialSlot; 
} 
0

如果你有記憶沒有問題一個很好的完整的集合(即:文件通常是不大)那麼我建議不要使用XmlTextReader和使用XmlDocument代替:

XmlDocument d = new XmlDocument(); 
d.Load(@"FileNameAndDirectory"); 
XmlNodeList list = d.SelectNodes("/Modules/Module/MName"); 
foreach (XmlNode node in list) 
{ 
    // Whatsoever 
} 

上面的代碼應提取前夕ry MName節點爲你,並把它們全部在list,使用它爲好:)

1

你初始化你的模塊數組爲16,並加載它與modulecounter,但在循環中使用數組長度。而是使用modulecounter變量來限制循環,就像這樣:

for (int i = 0; i < modulecounter; i++) 
{      
    ModulesListBox.Items.Add(modules[i].MName); 
} 

你的陣列是空的每一個值modulecounter以上。這就是錯誤的原因。