4

阅读此问题后,似乎以下代码应该失败:

private void Form1_Load(object sender, EventArgs e)
{
   EventHandler myHandler = null;
   myHandler(this, null);
}

但是当我运行它时,它工作得很好(并且什么都不做)。该代码的行为与以下代码有何不同?

private void Form1_Load(object sender, EventArgs e)
{
   EventHandler myHandler = null;
   EventHandler myCopy = myHandler;
   if (myCopy != null)
   {
      myHandler(this, null);
   }
}

编辑:根据 Lasse V. Karlsen 的回答,以这种方式捕捉异常是有效的:

private void Form1_Load(object sender, EventArgs e)
{
   try
   {
      EventHandler myHandler = null;
      myHandler(this, null);
   }
   catch (Exception ex)
   {
      this.Text = "Exception!";
   }
}
4

3 回答 3

6

这里的问题是 Load 事件正在吞噬您的异常。

这里还有其他关于这个的问题和网上关于它的其他帖子:

简而言之,在某些情况下(最常引用的原因是在 64 位 Windows 上运行的 32 位 .NET 程序)WinForms 表单的 Load 事件中的任何异常都将被吞没。

您可以将 Form Load 事件包装在 try/catch 块中以捕获它,并确定如何对其做出反应。

简而言之 2:代码确实如您预期的那样导致空引用异常,您只是没有看到它

于 2013-03-05T20:56:49.420 回答
2

您如何确定此代码运行良好?这段代码很可能在后台抛出异常,然后被 Windows 窗体运行时代码吞噬。调试器/运行时可以静默处理这种异常吞咽有几个原因

我会尝试调试这个或代码或禁止在委托调用下放置Messagebox.Show一行,看看它是否执行。

于 2013-03-05T20:53:14.610 回答
0

你确定代码什么都不做吗?

当我尝试这个时,我确实得到了一个:NullReferenceException

class Program
{
    static void Main(string[] args)
    {
        EventHandler myhandler = null;
        myhandler(null, null);
    }
}

也许你的代码永远不会被执行(例如你的Form1_Load事件处理程序没有被调用),或者你的异常被吞没了(例如被不同的线程)?

于 2013-03-05T20:57:15.847 回答