C# winform中列表的空值异常

C# winform中列表的空值异常,c#,winforms,arraylist,html-agility-pack,C#,Winforms,Arraylist,Html Agility Pack,我有两份清单: public List<string> my_link = new List<string>(); public List<string> english_word = new List<string>(); 然后,我将删除一些链接上的内容,我将这些内容存储在english\u word.Add(q)上它可以从除最后一个链接之外的所有链接中刮取内容。我的代码就是这样 foreach (string ss in my_link) {

我有两份清单:

public List<string> my_link = new List<string>();
public List<string> english_word = new List<string>();
然后,我将删除一些链接上的内容,我将这些内容存储在
english\u 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 ");
    }
}
最后一个链接显示“找不到英语单词”

我做错了什么

  • 更改catch语句以捕获所有异常,而不仅仅是NullReferenceException
  • 调试器是您的朋友,请使用它。我猜在向列表中添加新词之前,您可能会遇到异常情况。在foreach循环中设置断点

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

    其次,很可能是由于
    HtmlNode而出现此异常。如果未找到任何节点,SelectNodes
    方法将返回
    null
    (不是预期的空节点集合)。请参阅HTML,以及关于的讨论

    因此,不要使用
    来尝试。。catch
    block您可以使用以下内容:

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

    捕获NullReferenceException很少是正确的做法。如果您不忽略实际的异常,您可能会知道发生了什么。同意!而是检查null
    if(object!=null)
    if(!String.IsNullOrEmpty(yourString))
    用于字符串。在我的代码中,哪里可以使用它??@Amicable
    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 ");
    }