Можно ли получить нулевую ссылку в свойстве ListBox.Items? - PullRequest
2 голосов
/ 21 сентября 2009

РЕДАКТИРОВАТЬ 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, генерируют исключения. Единственный способ восстановления - закрыть приложение и восстановить его.

К сожалению, постоянно отвлекаясь на миллион других дел, я так и не удосужился добавить журналы до вставок. Я добавил запись сейчас, но может пройти месяц или больше, прежде чем мы снова увидим эту проблему. А пока есть еще идеи? Каковы некоторые возможные объяснения этому?

Я предполагаю, что мой настоящий вопрос: Кто-нибудь еще когда-либо видел, чтобы это произошло - доступ к ListBox, который существовал , существовал и внезапно получил NullReferenceException - и вы когда-нибудь могли выяснить почему / как решить проблему?

Ответы [ 4 ]

2 голосов
/ 22 сентября 2009

Внимательно изучите весь код, вполне вероятно, что Me.ListBox1 имеет значение null.

Однажды я работал над приложением, созданным третьей стороной, с кодом, подобным этому, который вызывался только в конкретном случае и вызывал исключение во время кода рендеринга asp.net ...

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

Также обратите внимание на трассировку стека в других сбоях, было бы иначе, если бы он выдул внутри метода элемента управления, чем если бы он выдул в вашем коде.

1 голос
/ 14 октября 2011

Причина - ошибка System.Windows.Form v2.0, которую я обнаружил сегодня утром (это исправлено в System.Windows.Form v4.0).

Для меня это произошло, когда мой код добавляет Item к ListBox, когда процесс хостинга завершается. Поле частного экземпляра ListBox.listItemsArray имеет значение null, и это вызывает NullReferenceException. Я не знаю точно, почему ListBox.listItemsArray имеет значение null, но я предполагаю, что это связано с проблемой создания дескриптора.

Для меня обходной путь был легким, так как try/catch было достаточно, потому что процесс все равно останавливался. Вы, конечно, можете решить проблему с функцией декомпиляции Reflector, как я:

enter image description here

1 голос
/ 22 сентября 2009

Сначала установите условную точку останова и попытайтесь выяснить и / или написать какой-нибудь защитный код. Я хотел бы добавить что-то вроде этого перед вашим кодом:

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, см. этот вопрос .

1 голос
/ 22 сентября 2009

Как вы уверены, что Me.ListBox1 не стал нулевым? Это было бы мое первое предположение.

...