为什么我的LINQ语句会抛出异常?

时间:2012-06-22 20:30:09

标签: c# linq linq-to-objects

我正在使用HTML敏捷包来抓取网站。我正在寻找包含某些文本的“a”元素的所有div标签。以下是示例代码:

 var showLocations = (from div in document.DocumentNode.Descendants("div")
                                 from a in div.DescendantNodes().Where(x => x.Name == "a")
                                 where a.Attributes["href"].Value.Contains("show_locs=Y")
                                 select a).SingleOrDefault();

但是,如果找不到该元素,则不会返回null,而是抛出“Null Reference Exception”。那是为什么?

2 个答案:

答案 0 :(得分:5)

我的猜测是<a>个标签没有href属性(即锚点而不是链接)。请尝试a.GetAttributeValue("href", "").Contains...

答案 1 :(得分:1)

您正在处理的各种对象有可能被评估为null,并且由于您没有进行空检查,因此有些可能会抛出 NullReferenceException 。可能的罪魁祸首:

  1. document.DocumentNode
  2. a.Attributes [ “HREF”]
  3. a.Attributes [ “HREF”]。值
  4. 如果您不确定要处理的对象,安全做法是使用空值守卫,除非您可以在封装类中保证相关对象不会为空。

    正如吉米在他的回答中指出的那样,你正在处理的标记可能无法保证你拥有的元素或属性,除非你能保证,你需要做一些防御性编程。