XMLNodeList空引用,即使在预先检查下一个innertext值之后也是如此

本文关键字:innertext 下一个 之后 检查 引用 XMLNodeList | 更新日期: 2023-09-27 18:29:55

我正在尝试从下一项中获取值,例如,如果下一项为null或不存在,它将继续打印。我遇到的主要问题仅在于的这一部分

主要问题:

try
{
 numCheck = productList[j+1]["Number"].InnerText;
}
catch (Exception ex)
{
    numCheck = string.Empty;
}
if (numCheck != null)
{
     try
     {                                
          mainNumber = Data.getFullItemDetail(productList[j + 1]["Number"].InnerText);                                
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.ToString());
     }

在尝试if else之前,我做了一个检查,只是为了确保该值存在,然而,即使在它检测到它有一个值之后,这一行也会抛出一个错误NullReference

mainNumber = Data.getFullItemDetail(productList[j + 1]["Number"].InnerText);

完整代码以防万一:

XmlDocument xml = new XmlDocument();
xml.LoadXml(productItems);
XmlNodeList productList = xml.SelectNodes("/Products/Product"); 
for (int j = 0; j < productList.Count; j++) 
{
     itemCount++;
     int i = j + 1;
     string item = productList[j]["Number"].InnerText;         
     number = Data.getFullItemDetail(item);
            try
            {
                #region mainItem
                if (number == 0)
                {
                    itemCount++;
                    itemName = productList[j]["Name"].InnerText;
                    try
                    {
                        numCheck = productList[i]["Number"].InnerText;
                    }
                    catch (Exception ex)
                    {
                        numCheck = string.Empty;
                    }
                    if (numCheck != null)
                    {
                        try
                        {                                
                            mainNumber = Data.getFullItemDetail(productList[i]["Number"].InnerText);                                
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                        if (mainNumber == 0)
                        {                                
                            foreach (string condimentItem in condiment)
                            {
                                condimentText += condimentItem.ToString() + "'n";
                            }
                            string text = condimentText + itemName + "'n" + employeeNum + "'n" + terminalNum + "'n";
                            //print here, because the next item is another main item.

                            };
                            try
                            {
                                p.Print();
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("Exception Occured While Printing", ex);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Error");
                        }
                    }
                    else
                    {                            
                        foreach (string condimentItem in condiment)
                        {
                            condimentText += condimentItem.ToString() + "'n";
                        }
                        string text = condimentText + itemName + "'n" + employeeNum + "'n" + terminalNum + "'n";                            
                    }
                }
                #endregion
                #region CondimentItem
                else if (number == 4)
                {                        
                    condiment.Add(productList[j]["Name"].InnerText);
                    try
                    {
                        numCheck = productList[i]["Number"].InnerText;
                    }
                    catch (Exception ex)
                    {
                        numCheck = string.Empty;
                    }
                    //Check next item.                    
                    if (numCheck == null)
                    {                            
                        foreach (string condimentItem in condiment)
                        {
                            condimentText += condimentItem.ToString() + "'n";
                        }
                        string text = condimentText + itemName + "'n" + employeeNum + "'n" + terminalNum + "'n";
                        //print here, because the next item is another main item.
                    }
                    else
                    {
                        mainNumber = Data.getFullItemDetail(productList[i]["Number"].InnerText);
                        if (mainNumber == 0)
                        {
                            foreach (string condimentItem in condiment)
                            {                                    
                                condimentText += condimentItem.ToString() + "'n";
                            }
                            string text = condimentText + itemName + "'n" + employeeNum + "'n" + terminalNum + "'n";
                            //print here, because the next item is another main item.
                        }
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

已编辑:Data.getFullItemDetail只返回1个int值。

    public static int getFullItemDetail(string number)
    {
        int num = Convert.ToInt32(number);
        int numReturn;
        using (SqlConnection conn = getConnectionSAP())
        {
            SqlCommand comm = new SqlCommand("select belongcond from ------ where number = " + num, conn); 
            conn.Open();
            SqlDataReader dr = comm.ExecuteReader();
            while (dr.Read())
            {
                num = Convert.ToInt32(dr["-------"]);
            }
            comm.Clone();
            comm.Dispose();
        }
        num = Convert.ToInt32(num.ToString().Substring(0, 1));
        return num;
    }

XMLNodeList空引用,即使在预先检查下一个innertext值之后也是如此

productList[j+1]["Number"]为null,因此在第二行抛出异常(因为无法调用null.InnerText),捕获异常,然后设置numCheck = string.Empty

您测试的下一行是if (numCheck != null),这是true,因为您只是在异常处理程序中将其设置为string.Empty。然后在productList[j+1]["Number"]上再次调用InnerText,这将再次抛出NullReferenceException

设置断点,遍历代码,检查变量,正如What is a NullReferenceException和how do I fix it?中所解释的那样?。

只需将您的if (numCheck != null)更改为if (productList[j+1]["Number"] != null)即可。