簡體   English   中英

為什么不調用null事件處理程序引發異常?

[英]Why doesn't calling a null event handler raise an exception?

閱讀此問題后 ,似乎以下代碼應該失敗:

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!";
   }
}

這里的問題是Load事件吞噬了你的異常。

此處還有其他關於此問題和網上其他帖子的問題:

簡而言之,在某些情況下(最常提到的原因是在64位Windows上運行的32位.NET程序),任何WinForms表單的Load事件中的異常都將被吞噬。

您可以將Form Load事件包裝在try / catch塊中以捕獲它,並確定如何對其作出反應。

簡而言之2:代碼確實會引起您所期望的空引用異常,您只是沒有看到它

您如何確定此代碼運行正常? 這個代碼很可能會引發一個異常,然后被Windows Forms Runtime代碼吞沒。 有幾個原因導致調試器/運行時可以靜默處理這種異常吞咽

我會嘗試調試這個或代碼或禁止在委托調用下放置Messagebox.Show行,看看它是否執行。

你確定代碼什么都不做

得到一個NullReferenceException ,當我試試這個:

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

也許您的代碼永遠不會被執行(例如,您的Form1_Load事件處理程序未被調用),或者您的異常可能被吞下(例如,通過不同的線程)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM