Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 帮助修复NullReferenceException_C#_Nullreferenceexception - Fatal编程技术网

C# 帮助修复NullReferenceException

C# 帮助修复NullReferenceException,c#,nullreferenceexception,C#,Nullreferenceexception,所以我一辈子都搞不懂如何找到这个NullReferenceError。我为一个名为ScannerHelper的程序编写了一个库。它的唯一用途是打开和关闭条形码阅读器。它运行的程序我无法访问源代码,但我经常与程序员交谈,这让我们都感到困惑。这是我们设置的跟踪 跟踪 OpenBarPort: Try Opening Barcode port ScannerHelper Information: 0 : (0):Open(COM6)+ ScannerHelper Information

所以我一辈子都搞不懂如何找到这个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,用于一切。令人恼火的是,他和我的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方法是否可能引发异常?