为什么我会得到这个NullReferenceException C#
我一直在为一个应用程序编写代码,通过Active directory查询来管理连接的用户和设备 然后我得到这个错误“NullReferenceException未处理”大约一周,使用代码这是现在唯一停止应用程序的事情 这是我使用的背景代码:为什么我会得到这个NullReferenceException C#,c#,datagridview,error-handling,nullreferenceexception,C#,Datagridview,Error Handling,Nullreferenceexception,我一直在为一个应用程序编写代码,通过Active directory查询来管理连接的用户和设备 然后我得到这个错误“NullReferenceException未处理”大约一周,使用代码这是现在唯一停止应用程序的事情 这是我使用的背景代码: private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e) { try { e.Result = ""; int val =
private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)
{
try
{
e.Result = "";
int val = 6000;
for (int a = 1; a <= val; a++)
{
counter.Text = Convert.ToString(a);
if (txtWorkGroupName.Text == "") return;
DataTable dt = new DataTable();
dt.Clear();
dt.Columns.Add(new DataColumn("ComputerName", typeof(String))); //0
dt.Columns.Add(new DataColumn("IP", typeof(String))); //1
dt.Columns.Add(new DataColumn("MAC", typeof(String))); //2
dt.Columns.Add(new DataColumn("Descubierto", typeof(String))); //3
//int i = 0;
try
{
// Datos del grupo WinNT://&&&&(Nombre del grupo de trabajo)
DirectoryEntry DomainEntry = new DirectoryEntry("WinNT://" + txtWorkGroupName.Text + "");
DomainEntry.Children.SchemaFilter.Add("Computer");
///*************************************************
/// Interacting with pc's in the domain
///*************************************************
foreach (DirectoryEntry machine in DomainEntry.Children)
{
string strMachineName = machine.Name;
string strMACAddress = "";
IPAddress IPAddress;
DateTime discovered;
try
{
IPAddress = getIPByName(machine.Name);
}
catch
{
continue;
}//try/catch
///*************************************************
/// Get Mac
///*************************************************
strMACAddress = getMACAddress(IPAddress);
discovered = DateTime.Now;
///*************************************************
/// Add lines in the grid
///*************************************************
DataRow dr = dt.NewRow();
dr[0] = machine.Name;
dr[1] = IPAddress;
dr[2] = strMACAddress;
dr[3] = Convert.ToString(discovered);
dt.Rows.Add(dr);
///*************************************************
/// SETTING DATASOURCE
///*************************************************
dgvComputers1.DataSource = dt;
Thread.Sleep(2000);
}//foreach loop
catch (Exception ex)
{
{
MessageBox.Show(ex.Message);
}
}
if (backgroundWorker2.CancellationPending)
{
e.Cancel = true;
return;
}
}
}
catch (NullReferenceException ex)
{
MessageBox.Show("error:" + ex);
}
catch (NoNullAllowedException ex)
{
MessageBox.Show("error:" + ex);
}
catch (AccessViolationException ex)
{
MessageBox.Show("error:" + ex);
}
}
尝试在中放置一个断点(如果您使用的是Visual Studio),并检查每一行,查看错误发生的位置 然后,在到达测线后,在watch窗口中查看空值 然后执行:
if(nullThing==null)返回当然,在发生错误的行之前,您不应该总是这样做,但要找出它为null的原因,并对其进行排序
这应该可以完成任务。请查看以下内容:
`private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)
删除那个
`
应该是:
private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)
你试过这个吗
dr[1] = IPAddress ?? "(unknown)";
这是一个多线程问题。在某个时刻,您试图在datagrid在屏幕上绘制自身的同时更改datagrid的数据源
dgvComputers1.DataSource = dt;
尝试将其替换为:
this.Invoke(delegate(DataTable table)
{
dgvComputers1.DataSource = table;
}, dt);
我认为这不会导致他所看到的错误。这可能只是粘贴代码时的一个输入错误。这可能会在编译时导致语法错误,而不是在运行时导致异常。`会导致编译错误。这只是代码格式上的一个输入错误。我不知道为什么这个问题被否决得如此糟糕。有人愿意留下评论吗?我的意思是,很明显,OP在某种程度上,呃,格式有问题,英语也有问题,但我们没有看到更糟糕的情况吗?是什么返回了这个java风格的函数getIPByName(machine.Name)代码>?无效的或者它会引发异常?@OP-请调试您的代码,并向我们显示发生异常的具体行。它总是失败还是只是偶尔出现?出于调试目的。。。对吗?因为这听起来不像是真正解决问题的方法。。。我设置了一个错误管理器来抛出这些例外,这样我就可以阅读它们了,我发现了这个。。。。“AL control datagridview无法添加没有列的行,必须先添加列…”然后是error@StefanH是的,但是一旦你发现了问题,找出它,看看它是从哪里来的,然后解决它:-)@HBellamy但是添加你的建议,完全绕过这个问题,又有什么用呢,是否有助于确定问题的原因?这是一个尚未完成的列行错误管理。。。。我不知道如何添加一列,如果它试图填补一行我不明白你在说什么,它看起来不像你回答我,无论你是否尝试过这个。所以,让我用另一种方式重复我的答案:替换您的行dr[1]=IPAddress代码>带有dr[1]=IPAddress??“(未知)”代码>我有一个附加的进程,我不能像那样更改。在这一点上,我引入了一种从远程计算机提取IP地址的方法。。。不必ping设备,因为我直接在广告中收集信息,模拟我的访问级别,这能解决什么问题?问题是关于NullReferenceException
查看堆栈跟踪。NullReferenceException发生在System.Windows.Forms.DataGridViewRowHeaderCell.PaintPrivate中。你说得对,我正试图用itSo测试应用程序,调用invoke更改任何内容?显示的方法也称为backgroundWorker2_Dowork-因此这肯定指向一些线程问题。
this.Invoke(delegate(DataTable table)
{
dgvComputers1.DataSource = table;
}, dt);