【问题标题】:Null reference exception in LinqLinq 中的空引用异常
【发布时间】:2012-09-29 12:50:03
【问题描述】:

我是 .net 初学者。在问这里之前,我已经浏览了很多网站。我收到错误 - “对象引用未设置为对象的实例。” .这个错误通常发生在任何控件中有空值但在我的情况下每个控件都有一些文本,那么为什么会出现这个错误?这是我的xml file

cmbProduct        --> combobox 
txtNewBrand       --> textBox
txtUpdateQuantity --> textBox
txtUpdatePrice    --> textBox

我尝试了以下代码:

onButtonClick

XElement doc = XElement.Load(@"..\..\stock.xml");
var newElement = new XElement("items",
                               new XElement("productname", cmbProduct.Text),
                               new XElement("brandname", txtNewBrand.Text),
                               new XElement("quantity", txtUpdateQuantity.Text),
                               new XElement("price", txtUpdatePrice.Text));
 /*ERROR*/      doc.Element("stock").Add(newElement);
                doc.Save(xpath);
                MessageBox.Show("updated successfully");

编辑:

而不是使用

XElement doc = XElement.Load(@"..\..\stock.xml");

我用过

var doc = XDocument.Load(@"..\..\stock.xml");

问题解决了。为什么会这样?

【问题讨论】:

  • 检查 doc.Element("stock") 实际上有一个值并且没有返回 null。
  • 好的,我会检查文档是否为空,谢谢。我会吓唬你等
  • 我认为文档不为空。我编辑了我的问题
  • 几乎所有的 NullReferenceException 情况都是一样的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

标签: c# xml linq c#-4.0


【解决方案1】:

您收到异常是因为:

doc.Element("stock").Add(newElement);

stock 是根节点,doc.Element("stock") 返回 null。你实际上想要做的是在你的 xml 中添加一个项目。请尝试以下操作:

doc.Add(newElement);

这将为您提供所需的结果。

【讨论】:

  • 我不知道根节点有不同的功能。谢谢。
【解决方案2】:

我猜你没有用现有的 XML 预加载 doc,如果是这样,将不会有任何 stock 元素开始。

尝试添加这个

if (doc.Element("stock") == null)
{
    doc.Add(new XElement("stock"));
}

之前

doc.Element("stock").Add(newElement);

【讨论】:

    【解决方案3】:

    鉴于代码有限,要查看您添加和/或断言存在的内容并不容易。尝试在错误上方添加这两行,错误消息将指示错误。

    Debug.Assert(doc != null, "Can not operate without a valid instance of 'doc'");
    Debug.Assert(doc.Element("stock") != null, "Need the stock element to add to!");
    

    您可能需要包含“使用 System.Diagnostics;”在文件的顶部。

    【讨论】:

    • 它正在显示这些诊断信息.. 我无法理解 i47.tinypic.com/25u1enn.jpg
    • 第一行是“need stock element to add to”——这是我说要插入的代码的第二行。因此,您需要在文档中添加“库存”。例如var stock = doc.Add(new Element("stock")); 并将您的线路更改为 stock.Add(newElement)
    • 只是为了签到我添加了var doc = XDocument.Load(@"..\..\stock.xml");这工作。为什么我无法理解。这个代码XElement doc = XElement.Load(@"..\..\stock.xml");在这里变得没用了?
    【解决方案4】:

    ather doc.Element("stock") 找不到并且为 NULL 或 doc 为 NULL

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 2020-08-22
      • 2011-07-22
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多