C# 帮助修复NullReferenceException
所以我一辈子都搞不懂如何找到这个NullReferenceError。我为一个名为ScannerHelper的程序编写了一个库。它的唯一用途是打开和关闭条形码阅读器。它运行的程序我无法访问源代码,但我经常与程序员交谈,这让我们都感到困惑。这是我们设置的跟踪 跟踪C# 帮助修复NullReferenceException,c#,nullreferenceexception,C#,Nullreferenceexception,所以我一辈子都搞不懂如何找到这个NullReferenceError。我为一个名为ScannerHelper的程序编写了一个库。它的唯一用途是打开和关闭条形码阅读器。它运行的程序我无法访问源代码,但我经常与程序员交谈,这让我们都感到困惑。这是我们设置的跟踪 跟踪 OpenBarPort: Try Opening Barcode port ScannerHelper Information: 0 : (0):Open(COM6)+ ScannerHelper Information
OpenBarPort: Try Opening Barcode port
ScannerHelper Information: 0 : (0):Open(COM6)+
ScannerHelper Information: 0 : (0):IsValidNewlandScanner(COM6)+
ScannerHelper Information: 0 : (0):HasValidName(COM6)+
ScannerHelper Information: 0 : (0):HasValidName(True)-
ScannerHelper Information: 0 : (0):CheckForNewlandScanner(COM6)+
ScannerHelper Information: 0 : (0):WriteCommand(3F)+
ScannerHelper Information: 0 : (0):WriteCommand()-
ScannerHelper Information: 0 : (0):ReadResponse()+
ScannerHelper Information: 0 : (0):ReadResponse(21)-
ScannerHelper Information: 0 : (0):CheckForNewlandScanner(True)-
ScannerHelper Information: 0 : (0):IsValidNewlandScanner(True)-
ScannerHelper Information: 0 : (0):set_port()+
ScannerHelper Information: 0 : (0):set_port(34786562)-
ScannerHelper Information: 0 : (0):ScannerOn(34786562)+
ScannerHelper Information: 0 : (0):ScannerOn()-
ScannerHelper Information: 0 : (0):Open(OPOS_SUCCESS)-
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
因此,他的名为OpenBarPort
的方法有一个try/catch,我的ScannerHelper.Open有一个try/catch,用于一切。令人恼火的是,他和我的try/catch语句都没有捕捉到任何东西。但如果他评论我的开放式方法,问题就消失了
这是我的Open方法代码,为了清晰起见,我取出了额外的跟踪代码
public int Open(string portName)
{
if (portName == null)
portName = "";
if (!IsValidNewlandScanner(portName))
return OPOS_E_FAILURE;
try
{
scannerPort = new System.IO.Ports.SerialPort(portName);
scannerPort.DataReceived += scannerPort_DataReceived;
scannerPort.Open();
if (trigger is CPScannerTrigger)
{
//Sets the SafeFileHandle
(trigger as CPScannerTrigger).port = scannerPort;
}
trigger.ScannerOn();
trigger.Opened = true;
}
catch (System.Exception ex)
{
Globals.TraceError(ex);
return OPOS_E_FAILURE;
}
return OPOS_SUCCESS;
}
扫描触发器
public override void ScannerOn()
{
Globals.TraceStart(handle.GetHashCode());
CP210xRT_WriteLatch(handle, 4, 0);
Globals.TraceEnd();
}
public override void ScannerOff()
{
Globals.TraceStart(handle.GetHashCode());
CP210xRT_WriteLatch(handle, 4, 4);
Globals.TraceEnd();
}
public System.IO.Ports.SerialPort port
{
set
{
Globals.TraceStart();
handle = GetHandleFromSerialPort(value);
Globals.TraceEnd(handle.GetHashCode());
}
}
private Microsoft.Win32.SafeHandles.SafeFileHandle GetHandleFromSerialPort(System.IO.Ports.SerialPort sp)
{
var BaseStream = sp.BaseStream;
var baseStreamType = BaseStream.GetType();
var flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance;
return baseStreamType.GetField("_handle", flags).GetValue(BaseStream) as Microsoft.Win32.SafeHandles.SafeFileHandle;
}
private Microsoft.Win32.SafeHandles.SafeFileHandle handle;
所以我从未见过这种类型的空引用错误。如果不是因为这个,我有可能使用2个条形码扫描仪,我只会将SafeFileHandle标记为静态。我觉得奇怪的是,Open返回后立即触发错误。我的条形码扫描仪打开,所以我知道触发器“工作”,但我不确定是什么导致了这个问题。当我在NUnit中运行单元测试时,它不会抛出异常。有人能帮忙吗?:)谢谢。我看到的唯一一件事是,他将端口名设置为“”,如果为空,则进行测试以确定其是否为有效的扫描仪。我会查看该方法,因为我想象他正在尝试根据名称“”查找端口。你能发布IsValidNewlandScanner代码吗?@Bearcat9425我当然能。公开密码是我的。我为IsValidNewlandScanner代码输入了一个空字符串,而不是null。该部分通过,否则扫描仪将永远无法打开。跟踪显示COM6被传递到我的方法中。在测试中工作但在生产中失败的代码是竞争条件的症状。参考Blah忽略我的评论我显然没有查看堆栈跟踪。异常是否包含任何内部异常?另外,scannerPort_DataReceived方法是否可能引发异常?