【问题标题】:How to add to a list without getting NULLREFERENCEEXCEPTION?如何在不获取 NULLREFERENCEEXCEPTION 的情况下添加到列表?
【发布时间】:2013-12-15 02:30:46
【问题描述】:

我一直在尝试从 sql 数据库中添加信息添加到列表列表中。将新信息添加到列表时出现的错误是:

“StatusScope.dll 中发生了“System.NullReferenceException”类型的异常,但用户代码中没有处理

附加信息:对象引用未设置为对象的实例。"

我该如何解决这个错误?

MapLogic.cs

public static List<MapModel.ClientInfo> GetClientsData()
    {
        SqlConnection Connection = site.Models.Shared.DBConnection.GetConnection();
        SqlDataReader Reader = null;
        SqlCommand Command = new SqlCommand("SELECT DocInfo.DocID, DocInfo.DocName, DocInfo.DocPic, DocInfo.PatientAcceptance, ClientInfo.ClientName, ClientInfo.AddressLocal, ClientInfo.AddressBroad, ClientInfo.Phone, ClientInfo.Lat, ClientInfo.Long, ClientInfo.ClientID FROM DocInfo INNER JOIN ClientInfo ON DocInfo.ClientID = ClientInfo.ClientID;", Connection);
        Reader = Command.ExecuteReader();

        var ClientsData = new List<MapModel.ClientInfo> { };
        int IDCounter = 0;
        bool FirstRun = false;

        while (Reader.Read())
        {
            if (!FirstRun)
            {
                ClientsData.Add(new MapModel.ClientInfo { Id = IDCounter, ClientID = Reader["ClientID"].ToString(), ClientName = Reader["ClientName"].ToString(), DocPic = Reader["DocPic"].ToString(), PatientAcceptance = Reader["PatientAcceptance"].ToString(), AddressLocal = Reader["AddressLocal"].ToString(), AddressBroad = Reader["AddressLocal"].ToString(), Phone = Reader["Phone"].ToString(), latitude = Reader["Lat"].ToString(), longitude = Reader["Long"].ToString(), DocNames = { } });
                FirstRun = true;
            }
            else
            {
                for (var x = 0; x < ClientsData.Count; x++)
                {
                    if (ClientsData[x].ClientID == Reader["ClientID"].ToString())
                    {
                        ClientsData[x].DocNames.Add("123"); //error occurs here
                    }
                    else
                    {
                        ClientsData.Add(new MapModel.ClientInfo { Id = IDCounter, ClientID = Reader["ClientID"].ToString(), ClientName = Reader["ClientName"].ToString(), DocPic = Reader["DocPic"].ToString(), PatientAcceptance = Reader["PatientAcceptance"].ToString(), AddressLocal = Reader["AddressLocal"].ToString(), AddressBroad = Reader["AddressLocal"].ToString(), Phone = Reader["Phone"].ToString(), latitude = Reader["Lat"].ToString(), longitude = Reader["Long"].ToString() });
                    }
                }
            }




            IDCounter++;
        }

        Connection.Close();
        return ClientsData;
    }

MapModel.cs

public class ClientInfo
        {
            public int Id { get; set; }
            public string ClientID { get; set; }
            public string ClientName  { get; set; }

            public List<string> DocNames { get; set; }

            public string DocPic { get; set; }

            public string PatientAcceptance { get; set; }
            public string AddressLocal { get; set; }
            public string AddressBroad { get; set; }
            public string Phone { get; set; }
            public string latitude { get; set; }
            public string longitude { get; set; }


        }

【问题讨论】:

  • "DocNames = { }" 这行可疑。
  • 更改公共列表 DocNames { get;放; } 到 public List ? DocNames { 得到;放; }

标签: c# list class


【解决方案1】:

您是否曾经将DocNames 设置为任何内容?如果不是,它将为空。

ClientInfo 的构造函数中你应该有

DocNames = new List<string>();

初始化一个空列表。

【讨论】:

    【解决方案2】:

    不就是在添加之前测试ClientsData[x].DocNames是否为null的情况吗?您可以将代码更改为

    if(ClientsData[x].DocNames == null) {
        ClientsData[x].DocNames = new List<string>();
    }
    
    ClientsData[x].DocNames.Add("123");
    

    这样它总是有效的。

    【讨论】:

    • new List&lt;string&gt;()怎么样?
    【解决方案3】:

    在将新的 MapModel.ClientInfo 添加到 ClientsData 列表的两行中,您需要将 DocNames 初始化为新的 List() ,否则当您尝试访问 DocNames 时,它始终为空。因此,在这两个地方您都需要执行以下操作:

    ClientsData.Add(new MapModel.ClientInfo                 
    { 
      Id = IDCounter,                       
      //.
      //. removing code just to make my answer shorter
      //.
      DocNames = new List<string>()
    });
    

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2019-09-09
      • 2020-10-29
      • 1970-01-01
      • 2022-12-18
      相关资源
      最近更新 更多