【问题标题】:null value exception for a list in a winformwinform中列表的空值异常
【发布时间】:2013-02-04 16:56:51
【问题描述】:

我有 2 个列表:

public List<string> my_link = new List<string>();
public List<string> english_word = new List<string>();

我正在从页面中抓取一些链接并将它们保存到“my_link”;为此,我使用以下代码:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load("http://search.freefind.com/find.html?id=59478474&pid=r&ics=1&query=" + x);
HtmlNodeCollection nodes=doc.DocumentNode.SelectNodes("//font[@class='search-results']//a");

try
{
    foreach (HtmlNode n in nodes)
    {
        link = n.InnerHtml;
        link = link.Trim();
        my_link.Add(link);
    }
}
catch (NullReferenceException )
{
    MessageBox.Show("NO link found ");            
}
       

然后我正在抓取我抓取的链接上的一些内容,并将每个链接的内容存储在english_word.Add(q); 它可以从除最后一个链接之外的所有链接中抓取内容。我的代码就是这样

foreach (string ss in my_link)
{
    HtmlWeb web2 = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc2 = web2.Load(ss);
    HtmlNodeCollection nodes2 = doc2.DocumentNode.SelectNodes("//table[@id='table1']//tr[position()>1]//td[position()=2]");
    try
    {
        foreach (HtmlNode nn in nodes2)
        {
            q = nn.InnerText;
            q = System.Net.WebUtility.HtmlDecode(q);
            q = q.Trim();
            english_word.Add(q);
        }
    }
    catch (NullReferenceException ex)
    {
        MessageBox.Show("No english word is found ");
    }
}

只有最后一个链接显示“没有找到英文单词”

我做错了什么?

【问题讨论】:

  • 捕获 NullReferenceException 很少是正确的做法。
  • 如果您不忽略实际的异常,您也许可以弄清楚发生了什么。
  • 同意!而是检查 null! if (object != null)if (!String.IsNullOrEmpty(yourString)) 用于字符串。
  • 我在哪里可以在我的代码上使用它???@Amicable

标签: c# winforms arraylist html-agility-pack


【解决方案1】:

首先,在这里捕获NullReferenceException 不是一个好主意。最好检查 null 您期望 null 的位置。

其次,如果没有找到节点,您很可能会因为HtmlNode.SelectNodes 方法返回null(不是一个空的节点集合,正如您所期望的那样)而收到此异常。请参阅 HTML Agility Pack Null ReferenceC#/ Html Agility pack error “Value cannot be null. Parameter name: Source.”,以及关于 CodePlex 的讨论。

因此,您可以使用以下内容来代替 try .. catch 块:

if (nodes2 != null)
{
    foreach (HtmlNode nn in nodes2)
    {
        q = nn.InnerText;
        q = System.Net.WebUtility.HtmlDecode(q);
        q = q.Trim();
        english_word.Add(q);
    }
}
else
{
    MessageBox.Show("No english word is found ");
}

【讨论】:

    【解决方案2】:
    1. 更改您的 catch 语句以捕获所有异常,而不仅仅是 NullReferenceException。
    2. 调试器是你的朋友,使用它。我猜你在向列表中添加新单词之前会在某个地方遇到异常。在 foreach 循环中设置断点。

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2011-12-24
      • 2015-01-13
      • 2014-02-01
      • 2020-10-29
      相关资源
      最近更新 更多