无法解释的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块来绕过它,但我想知道是什么导致了这个问题。
有人对此有想法吗?
谢谢!
如果这些操作是在不同的线程中完成的,则在添加或删除项时应该锁定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);
}
}