为什么我得到这个NullReferenceException c#

本文关键字:NullReferenceException 为什么 | 更新日期: 2023-09-27 18:18:39

我一直在为一个应用程序的代码工作,通过Active directory查询来管理连接的用户和设备。

然后我得到这个错误"NullReferenceException未处理"大约一个星期,与代码一起工作,这是现在唯一停止应用程序的东西。

这是我使用的后台代码:

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

这是异常细节,抱歉,它们是西班牙语。

    System.NullReferenceException was unhandled
    Message="Object reference not set to an instance of an object."
      Source="System.Windows.Forms"
    StackTrace:
   en System.Windows.Forms.DataGridViewRowHeaderCell.PaintPrivate(Graphics graphics,   Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates dataGridViewElementState, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts, Boolean computeContentBounds, Boolean computeErrorIconBounds, Boolean paint)
   en System.Windows.Forms.DataGridViewRowHeaderCell.Paint(Graphics graphics, Rectangle  clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState,  Object value, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle,  DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
   en System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle  clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState,  DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle,   DataGridViewPaintParts paintParts)
   en System.Windows.Forms.DataGridViewRow.PaintHeader(Graphics graphics, Rectangle  clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState,   Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
   en System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
   en System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded)
   en System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
   en System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
   en System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   en System.Windows.Forms.Control.WmPaint(Message& m)
   en System.Windows.Forms.Control.WndProc(Message& m)
   en System.Windows.Forms.DataGridView.WndProc(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   en System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   en       System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.        IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   en System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,   ApplicationContext context)
   en System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   en System.Windows.Forms.Application.Run(Form mainForm)
   en NetworkScanner.Program.Main() en C:'Project Sigma 6'New Power  move'discover'Program.cs:línea 17
   en System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   en System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   en System.Threading.ExecutionContext.Run(ExecutionContext executionContext,  ContextCallback callback, Object state)
   en System.Threading.ThreadHelper.ThreadStart()

为什么我得到这个NullReferenceException c#

这是一个多线程问题。在某些时候,你试图在数据网格在屏幕上绘制自己的同时改变它的数据源。

 dgvComputers1.DataSource = dt;

试着用:

 this.Invoke(delegate(DataTable table)
 {
     dgvComputers1.DataSource = table;
 }, dt);

你试过吗?

dr[1] = IPAddress ?? "(unknown)";

尝试设置一个断点(如果您使用的是Visual Studio),并检查每一行,看看错误发生在哪里。

然后,到达行后,检查手表窗口,看看什么是空的。

然后在发生错误的行之前转:if(nullThing == null) return;,当然,您不应该总是这样做,但要找出为什么它是空的,并将其排序。

应该可以了

看看这个:

`private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)

删除

`

应该是:

private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)