2

编辑 11-20-2009:这个问题是很久以前发布的,但这个问题今天早上又出现了;所以我希望其他人可以提供一些见解(尽管提供的答案已经很有帮助)。

一旦在我们的生产环境中出现蓝月亮,我们就会NullReferenceException从引用控件的Items属性中得到一个ListBox。我在下面包含了一些示例代码。

有问题的父表单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抛出异常的后续方法。恢复的唯一方法是关闭应用程序并将其重新启动。

不幸的是,我经常被一百万件其他事情分心,我从来没有在插入之前添加日志记录。我现在已经添加了日志记录,但我们可能需要一个月或更长时间才能再次看到这个问题。与此同时,还有什么想法吗?对此有哪些可能的解释?

我想我真正的问题是:有没有其他人见过这种情况 - 访问确实存在的 aListBox突然得到 a NullReferenceException- 你是否能够弄清楚为什么/如何解决问题?

4

4 回答 4

2

深入查看所有代码,Me.ListBox1 很可能为空。

我曾经在一个由第三方构建的应用程序上工作,像这样的代码仅在特定情况下被调用,并在 asp.net 渲染代码期间导致异常......

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

还要注意其他故障中的堆栈跟踪,如果它在控件的方法内部爆炸与在您的代码中爆炸会有所不同。

于 2009-09-21T20:11:46.333 回答
1

你有多确定它Me.ListBox1没有变成空值?那将是我的第一个猜测。

于 2009-09-21T20:04:32.383 回答
1

原因是我今天早上发现的 System.Windows.Form v2.0 错误(在 System.Windows.Form v4.0 中已修复)。

对我来说,它发生在我的代码添加ItemListBox托管进程关闭时。私有实例字段ListBox.listItemsArray为空,这会引发NullReferenceException. 我不确切知道为什么ListBox.listItemsArray为空,但我猜它与句柄创建问题有关。

对我来说,解决方法很简单,因为 atry/catch就足够了,因为该过程无论如何都会关闭。您当然可以像我一样使用反编译反射器功能挖掘问题:

在此处输入图像描述

于 2011-10-14T10:36:19.177 回答
1

首先,设置一个条件断点并尝试找出,和/或编写一些保护性代码。我会在您的代码前面添加类似 tis 的内容:

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#,但你明白了。)

还要确保 null 异常实际上并未发生在 SelectedIndexChanged 或类似事件中。

但它可能真的是一个 ListBox 问题,请参阅这个问题

于 2009-09-21T20:38:53.673 回答