异常:System.NullReferenceException:未将对象引用设置为对象的实例。在C#?

时间:2010-11-21 19:49:51

标签: c#

edittted:

我已经调试了,我发现一旦我填满所有字段,自动生成一个新的空行,一旦它存储在dabase中,它跟随循环foreach,并自动检测空引用这个是一个图像,我希望你理解我img8.imageshack.us/i/error3xh.jpg

我需要你的帮助,我无法控制异常,这里是我的方法和错误说System.NullReferenceException:对象引用未设置为对象的实例“,我该如何修复它,控制exeption,没有这种类型的消息?,无论它的结构如何:错误是行** if(combo3 == null || combo4 == null)**

alt text

private void btnCronograma_Click(object sender, EventArgs e)
{
  string connstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\amaury\\Documents\\TEC\\Septimo Semestre\\Administracion de proyectos de ingenieria de softwaere\\nuevo4\\nuevo\\Office\\Office\\Policias.accdb";
  using (OleDbConnection conn = new OleDbConnection(connstring))
   {
    conn.Open();

    string sql = "INSERT INTO IndicadorProyecto (idProyecto, idMes, meta, real) VALUES(@idProyecto , @idMes , @meta, @real)";
    OleDbCommand cmd = new OleDbCommand(sql, conn);

  foreach (DataGridViewRow row in dataGridView8.Rows)
  {
    DataGridViewComboBoxCell combo3 = row.Cells["idProyecto"] as DataGridViewComboBoxCell;
    DataGridViewComboBoxCell combo4 = row.Cells["idMes"] as DataGridViewComboBoxCell;

    if (combo3 == null || combo4 == null)
    {
        MessageBox.Show("No se pudo convertir");
        continue;
    }

  int idProyecto = int.Parse(combo3.Value.ToString());
  int idMes = int.Parse(combo4.Value.ToString());
  int meta = int.Parse(row.Cells[3].Value.ToString());
  int real = int.Parse(row.Cells[4].Value.ToString());  

  cmd.Parameters.Clear();
  cmd.Parameters.AddWithValue("@idProyecto", idProyecto);
  cmd.Parameters.AddWithValue("@idMes", idMes);
  cmd.Parameters.AddWithValue("@meta", meta);
  cmd.Parameters.AddWithValue("@real", real);


  cmd.ExecuteNonQuery();
  }
}
}

这是完整的错误

  

Consulte el final de este mensaje para   obtenermásdetallessobrecómo   invocar adepuduraciónInst-In-Time   (JIT)en lugar de a este cuadro de   diálogo。

     

************** Texto delaexcepción************** System.NullReferenceException:   Referencia objeto no establecida   como instancia de un objeto。恩   Office.Form1.btnCronograma_Click(对象   sender,EventArgs e)en   C:\ Users \用户阿毛里\文档\ TEC \ Septimo   Semestre \ Administracion de proyectos   de ingenieria de   softwaere \ nuevo4 \ NUEVO \办公室\办公室\ Form1.cs中:拉利内阿   726 en   System.Windows.Forms.Control.OnClick(EventArgs的   e)en   System.Windows.Forms.Button.OnClick(EventArgs的   e)en   System.Windows.Forms.Button.OnMouseUp(MouseEventArgs   mevent)en   System.Windows.Forms.Control.WmMouseUp(消息&安培;   m,MouseButtons按钮,Int32点击)   恩   System.Windows.Forms.Control.WndProc(消息&安培;   m)en   System.Windows.Forms.ButtonBase.WndProc(消息&安培;   m)en   System.Windows.Forms.Button.WndProc(消息&安培;   m)en   System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息&安培;   m)en   System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息&安培;   m)en   System.Windows.Forms.NativeWindow.Callback(IntPtr的   hWnd,Int32 msg,IntPtr wparam,IntPtr   LPARAM)

3 个答案:

答案 0 :(得分:3)

我认为最可能的原因是row.Cells[3].Valuerow.Cells[4].Value为空(因为您没有给它们一个值),而.ToString()会抛出一个空异常。

将代码更改为:

int meta = int.Parse(row.Cells[3].Value == null ? "0" : row.Cells[3].Value.ToString());
int real = int.Parse(row.Cells[4].Value == null ? "0" : row.Cells[4].Value.ToString());  

答案 1 :(得分:0)

这只是在黑暗中拍摄,但标题行是集合中的一行。尝试添加

if(row.index != 0)

就在foreach内。我不记得了,但索引可能是-1。

答案 2 :(得分:0)

如何调试:

当您在DEBUG模式下运行应用程序(在Visual Studio中为F5)并抛出异常时,Visual Studio将停止并突出显示黄色的一行。这里引发了异常。在此行放置一个断点,重新启动应用程序,当它在断点处停止时,通过将鼠标悬停在该行上来观察什么是空值。

if (combo3 == null || combo4 == null)不能抛出NullReferenceException。我猜你运行的是旧版本的.exe,所以它会报告旧的行号。

从您的代码中,似乎row.Cells[3].Valuecombo3.Value为空。提示:在点'.'之前,你永远不会有空值。