无法解释的空例外错误

时间:2015-07-03 09:46:22

标签: c#

在我的一个应用程序中,我创建了一种队列列表,以便我的应用程序可以按正确的顺序发送midi信号。

因此,每当我想播放midi-note时,我都会将midinote添加到列表中。

我还有一个后台工作人员正在运行,它会不断检查“队列”中是否有等待记录,如果有,他会将其发送到输出设备。

现在我想对此进行压力测试,20个中的19个完美无缺。每隔一段时间,我就会得到一个nullexception错误。事实是,我不知道为什么它会给我这个错误。

我唯一可以想到的是,在背景工作者检查队列中是否有等待的时候,还有第二个参数仍然缺少,这就是为什么他拖出错误

然而,当我查看队列的内容时,它就在那里。

让我告诉你代码:

public class queueClass
{ 
    public int note {get; set;}
    public int delay { get; set; }

    public queueClass(int selectedNote, int selectedDelay)
    {
        note = selectedNote;
        delay = selectedDelay;
    }
}

List<queueClass> midiQueue = new List<queueClass>();

public void playNote(int noteNumber, int delay)
    { 
        if (Enabled)
        {
            // ADD THE NOTE TO THE QUEUE 
            midiQueue.Add(new queueClass(noteNumber, delay));

            if (!bgwMidi.IsBusy)
            {
                bgwMidi.RunWorkerAsync();
                Console.WriteLine(DateTime.Now + " >>> BACKGROUNDWORKER MIDI STARTED");

            }
        }


    }

 private void bgwMidi_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        while (worker.IsBusy)
        {
            if (worker.CancellationPending)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                // CHECK IF THERE IS A MIDINOTE IN THE QUEUE
                if (midiQueue != null && midiQueue.Count > 0)
                {
                    if (midiQueue[0].note > -1 && midiQueue[0].delay > -1)
                    {
                        sendNote(midiQueue[0].note, midiQueue[0].delay);
                    }
                }
            }
        }
    }

此代码的第一行引发错误:

if (midiQueue[0].note > -1 && midiQueue[0].delay > -1)
{
   sendNote(midiQueue[0].note, midiQueue[0].delay);
}

它说:

  

对象引用未设置为对象的实例

然而,当我查看我的midiQueue时,它保留了值:

  

延迟:0

     

注意:5

现在我试图通过将它放入try-catch块来绕过错误,但我想知道是什么导致了这个问题。

有人对此有所了解吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

如果在不同的线程中完成这些操作,则应在添加或删除项目时锁定midiqueue。

推送商品时:

lock (midiQueue) { midiQueue.Add(new queueClass(noteNumber, delay)); }

弹出项目时:

lock (midiQueue) { /* the pop operation(s) */

使用物品时:

lock (midiQueue)
{
   if (midiQueue != null && midiQueue.Count > 0)
   {
     if (midiQueue[0].note > -1 && midiQueue[0].delay > -1)
                    sendNote(midiQueue[0].note, midiQueue[0].delay);
   }
}

答案 1 :(得分:0)

你检查一下:

midiQueue != null && midiQueue.Count > 0

所以从那里你知道你有一个instanciated midiQueue和midiQueue中的至少一个元素。

然后你这样做:

midiQueue[0].note > -1 && midiQueue[0].delay > -1

这是你的问题。如果midiQueue [0]为null,则midiQueue [0] .note将抛出“对象引用未设置为对象的实例”异常。

所以你应该修改你的测试:

if (midiQueue != null && midiQueue.Count > 0)
{
   if (midiQueue[0] != null && midiQueue[0].note > -1 && midiQueue[0].delay > -1)
   {
       sendNote(midiQueue[0].note, midiQueue[0].delay);
   }
}