【发布时间】:2020-11-03 05:25:02
【问题描述】:
我正在尝试将数据表添加到属于一种模式类的数据表列表(发布过滤操作)。我的调试语句_return.SearchResult.Add(_i); 出现以下异常。我在我的实际陈述中也遇到了同样的错误_return.SearchResult.Add(_t);。请帮我找出问题所在。
感谢和问候, S. Sudharsan
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=*******
StackTrace:
at *******.*******.searchCMDBData(String SearchString) in D:\GIT_VS2019_WorkSpace\*******\*******\*******.asmx.cs:line 38
at *******.*******._Default.DoSearch(Object sender, EventArgs e) in D:\GIT_VS2019_WorkSpace\*******\*******.*******\Default.aspx.cs:line 57
public QR searchCMDBData(string SearchString)
{
QR _return = new QR();
_return.responseType = ResponseType.MESSAGE;
_return.responseMsg = "Successfully called as expected";
string INVENTORY_FILE = ConfigurationManager.AppSettings["INVENTORY_FILE_PATH"];
List<DataTable> _ret = new List<DataTable>();
_ret = CMDB.GetRequestsDataFromExcel(INVENTORY_FILE);
foreach (DataTable _i in _ret)
{
_return.SearchResult.Add(_i);
if (_i.TableName == "Inventory Consolidated")
{
DataTable _t = _i.AsEnumerable()
.Where(r => r.Field<string>("IP Address").Equals(SearchString) || r.Field<string>("Host Name").Equals(SearchString))
.CopyToDataTable();
if (_t.Rows.Count > 0)
{
_return.SearchResult.Add(_t);
}
}
}
return _return;
}
public enum ResponseType { SUCCESS, MESSAGE };
public class QR
{
public ResponseType responseType;
public string responseMsg;
public List<DataTable> SearchResult;
}
【问题讨论】:
-
这能回答你的问题吗? What is a NullReferenceException, and how do I fix it?。提示:你在哪里初始化 SearchResult?
-
_return.SearchResult。在第一次迭代期间预计为空。因此它是空的。但是请告诉我我初始化模态类“QR”的方式是否有任何错误。
-
您使用新列表初始化
_ret。然后,您立即将其丢弃并将其设置为GetRequestsDataFromExcel的返回值。但正如@klausgutter 指出的那样,您的 NRE 来自对_return.SearchResult.Add的调用。除非您没有显示QR构造函数,否则SearchResult为空。您应该能够在调试器中快速推断出这个非常(您展示的代码将是一个很好的示例来练习使用调试器) -
如果
_return.SearchResult为空,你不能在上面调用Add- 它会抛出一个NRE -
Hook.. 我的错.. 我没有正确理解 @klausgutter 的提示 :-) 感谢您使用构造函数。我知道它没有初始化。但不确定在哪里初始化它。在构造函数中初始化它修复了它..感谢您的快速帮助....!