阅读this question后,以下代码似乎会失败:
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!";
}
}
答案 0 :(得分:6)
这里的问题是Load事件正在吞噬您的异常。
此处还有其他关于此问题和网上其他帖子的问题:
简而言之,在某些情况下(最常提到的原因是在64位Windows上运行的32位.NET程序),将吞下WinForms表单的Load事件中的任何异常。
您可以将表单加载事件包装在try / catch块中以捕获它,并确定如何对其做出反应。
简而言之2:代码确实会引起您所期望的空引用异常,您只是没有看到它
答案 1 :(得分:2)
您如何确定此代码运行正常?这个代码很可能会引发一个异常,然后被Windows Forms Runtime代码吞没。有几个原因导致调试器/运行时
可以无声地处理这种异常吞咽我会尝试调试此代码或禁止在委托调用下放置Messagebox.Show
行并查看它是否执行。
答案 2 :(得分:0)
您确定代码什么都不做?
我做在我尝试时获得NullReferenceException
:
class Program
{
static void Main(string[] args)
{
EventHandler myhandler = null;
myhandler(null, null);
}
}
也许您的代码永远不会被执行(例如,您的Form1_Load
事件处理程序未被调用),或者您的异常被吞下(例如,通过其他线程)?