无法解释的Null异常错误

本文关键字:错误 异常 Null 无法解释 | 更新日期: 2023-09-27 18:00:54

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

所以每当我想演奏一个midi音符时,我都会把这个midi音符添加到列表中。

我也有一个后台工作人员在运行,它将不断检查是否有钞票在";队列";如果有,他会把它发送到输出设备。

现在我想对它进行压力测试,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块来绕过它,但我想知道是什么导致了这个问题。

有人对此有想法吗?

谢谢!

无法解释的Null异常错误

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

当你推送项目时:

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);
   }
}

您检查此项:

midiQueue != null && midiQueue.Count > 0

因此,您知道您有一个实例化的midiQueue和midiQueue中的至少一个元素。

然后你这样做:

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

这就是你的问题。如果midiQueue[0]为null,那么midiQueQueue[0].note将引发"Object reference not set to a instance of a Object"异常。

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

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);
   }
}