winform中列表的空值异常

时间:2013-02-04 16:56:51

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

我有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 ");
    }
}

对于最后一个链接,它只显示“找不到英文单词”

我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

首先,在这里捕捉NullReferenceException不是一个好主意。最好检查一下你期望空值的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 ");
}