我正在尝试将数组中的模块名称显示到listBox,但我收到"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
。
答案 0 :(得分:1)
ModulesListBox
为空,因为您在初始化之前访问它,或者modules
数组包含空元素。
正如其中一位评论者所说,您可能最好使用XmlSerializer来处理将XML加载到模块集合中。如果无法做到这一点,请改为modules
改为List<Modules>
。
答案 1 :(得分:1)
您将模块数组初始化为16个长度,然后使用modulecounter
加载它,但在循环中使用数组长度。而是使用modulecounter
变量来限制循环,如下所示:
for (int i = 0; i < modulecounter; i++)
{
ModulesListBox.Items.Add(modules[i].MName);
}
对于每个值modulecounter
及以上,您的数组为空。这就是错误的原因。
答案 2 :(得分:0)
for循环从0到16,但模块只有0到15,将modules.length
更改为(modules.length -1
)
答案 3 :(得分: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
s的完整集合,假设它被定义为
public class Module
{
public string MCode;
public string MName;
public int MCapacity;
public int MSemester;
public string MPrerequisite;
public int MLectureSlot;
public int MTutorialSlot;
}
答案 4 :(得分:0)
如果您对内存没有任何问题(即:文件通常太太大),那么我建议您不要使用XmlTextReader
并使用XmlDocument
代替:< / p>
XmlDocument d = new XmlDocument();
d.Load(@"FileNameAndDirectory");
XmlNodeList list = d.SelectNodes("/Modules/Module/MName");
foreach (XmlNode node in list)
{
// Whatsoever
}
上面的代码应该为您提取每个MName
节点并将它们全部放在list
中,并将其用于好处:)