帮助修复NullReferenceException

时间:2013-07-16 15:49:00

标签: c# nullreferenceexception

所以我对我的生活无法弄清楚如何找到这个NullReferenceError。我为一个名为ScannerHelper的程序编写了一个库。它的唯一目的是打开和关闭条形码阅读器。它运行的程序我无法访问源代码,但我经常与程序员交谈,这让我们感到难过。这是我们设置的跟踪。

微量

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语句都没有捕捉到任何东西。但如果他评论我的开放式方法,问题就会消失。

这是我的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;
}

ScannerTrigger

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中运行我的单元测试时,它不会被抛出异常。有人可以提供协助吗? :)谢谢。

0 个答案:

没有答案