2009-09-21 61 views
2

編輯11-20-2009:這個問題很早以前就發佈了,但問題今天早上又一次上升;所以我希望別人能夠提供一些見解(儘管提供的答案已經有幫助)。是否有可能從ListBox.Items屬性獲得空引用錯誤?

在我們的生產環境中,一旦進入藍色月亮,我們會通過引用ListBox控件的Items屬性獲得NullReferenceException。我已經在下面包含了一些示例代碼。

有問題的ListBox的父窗體擁有一個私人的Queue<string>,稱爲QueuedMessages。該隊列接收有關事件的新消息。在那熄滅每隔500毫秒計時,下面的方法被執行:

void DisplayQueuedMessages() { 
    lock (QueuedMessages) { 
     while (QueuedMessages.Count > 0) { 
      string msg = QueuedMessages.Dequeue(); 
      this.lbxMessages.Items.Insert(0, msg); // NullReferenceException 
      if (this.lbxMessages.Items.Count > MAX_LBX_ITEMS) { 
       this.lbxMessages.Items.RemoveAt(Me.lbxMessages.Items.Length - 1); 
      } 
     } 
    } 
} 

同樣,正如我所說,這只是拋出NullReferenceException非常很少。在使用該應用程序的幾個月內,它發生了三次或四次。

而且,幾次出現這種情況,似乎無論是ListBox.Items財產或只是ListBox本身是神祕消失了:該項目添加到ListBox拋出異常所有後續方法。恢復的唯一方法是關閉應用程序並將其恢復。

不幸的是,在不斷分心以及其他一百萬件事情的情況下,我從來沒有想到在插入之前添加日誌記錄。我已經添加了日誌記錄功能,但可能需要一個月或更長時間才能再次看到此問題。在此期間,還有什麼想法?對此有什麼可能的解釋?

我想我真正的問題是:有任何人見過這種事情發生 - 訪問ListBox沒有存在,突然得到一個NullReferenceException - 和你曾經能夠弄清楚爲什麼/如何解決問題?

+0

在哪裏你插入發生? – 2009-09-21 20:30:50

+0

還有什麼可以訪問Me.lbxMessages.Items? – 2009-09-22 21:58:48

+0

訪問此屬性的代碼中的唯一要點是:'ProcessQueuedMessages()',它在'Windows.Forms.Timer'上每500毫秒關閉一次(所以在GUI線程上);另一種可能發生在調用'Me.lbxMessages.Items.Clear()'的GUI事件上的方法。 – 2009-09-22 22:56:34

回答

1

你有多確定Me.ListBox1還沒有變爲空?這將是我的第一個猜測。

+0

我不確定。如果在代碼中沒有處置或設置爲null,那麼可以使它爲空? – 2009-09-21 20:06:55

+0

你在哪裏設置這個狀態消息?哪些事件? – 2009-09-21 20:13:49

+0

沒有實例化? – Dykam 2009-09-21 20:14:26

2

深入研究所有代碼,很可能Me.ListBox1爲null。

我曾經對第三方的代碼像這樣在特定的情況下,只有打來電話,在asp.net渲染代碼導致異常建造一個應用程序...

void ClearItems() 
{ 
    SomeField.Text = ""; 
    ... 
    AnotherField = null; 
    ... 
} 

另外要注意在其他故障中的堆棧跟蹤中,如果它在控件的方法內部吹動,那麼它將會不同於它在代碼中的吹響。

1

首先,設置一個條件斷點並試圖找出,和/或寫一些保護性代碼。我想補充的東西就像那朵在你的代碼前面:

System.Diagnostics.Debug.Assert(Me.ListBox1 != null); 
System.Diagnostics.Debug.Assert(Me.ListBox1.Items != null); 
String msg = getStatusMessage(); 
System.Diagnostics.Debug.Assert(msg != null); 
Me.ListBox1.Items.Insert(0, msg); 

(我客串我在這裏混VB和C#,但你得到的圖片。)

同時確保零異常是不實際發生在SelectedIndexChanged或類似事件中。

但它是可能的,它確實是一個ListBox問題,請參閱this question

1

原因是我今天早上發現的一個System.Windows.Form v2.0錯誤(並且在System.Windows.Form v4.0中已修復)。

對我而言,當我的代碼在託管進程關閉時,Item被加入ListBox時,發生了這種情況。私有實例字段ListBox.listItemsArray爲空,這引發了NullReferenceException。我不知道爲什麼ListBox.listItemsArray爲空,但我猜它與手柄創建問題有關。

對我來說,解決方法很簡單,因爲try/catch就足夠了,因爲該過程正在關閉。你當然可以挖掘伊諾與反編譯反射功能的問題,因爲我做的事:

enter image description here

相關問題