-1

我正在编译一个最初在 Visual C# 2005 中构建的程序。我正在使用 Visual C# 2010。在以下函数上运行程序时,我不断收到“NullReference Execption was unhandled”错误: 错误发生在与数据缓冲区。DataBuffer 是一个私有字符串,在初始化时设置为 null。

if (DataBuffer.Contains(ok)) 
            {
                okFound = true;
            }

    string temp = getLine(DataBuffer.Substring(mylocation));
    if (!checkTypeFound())
    {
        if (temp != null)
        {
            parseDeviceType(temp);
        }
        checkTypeFound();
    }

当我检查上面代码中 DataBuffer 的值时(当我收到错误时),这不为空。它实际上包含我期望的数据。DataBuffer 信息在此函数中加载:

private void ser1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    while (ser1.BytesToRead > 0)
    {
        string data = ser1.ReadExisting();
        DataBuffer += data;
    }
}

串行端口在代码中的其他位置打开。代码没有变化,只是编译器不同。我应该添加哪一行,以及在哪里解决这个错误?请注意,我可以使用 if 和 try-catch 语句来防止发生此错误。但这不是我要找的,我需要这段代码才能工作。除了编译器之外,该应用程序没有以任何方式进行更改。

4

3 回答 3

1

你应该在调用它的方法之前检查是否DataBuffer是。null

if (DataBuffer != null && DataBuffer.Contains(ok)) 
{
    okFound = true;
}

// or simpler:
okFound = (DataBuffer != null && DataBuffer.Contains(ok));

并且您的第二个代码被剪断也应该检查null

string temp = String.Empty;

if (DataBuffer != null)
    temp = getLine(DataBuffer.Substring(mylocation));

if (!checkTypeFound())
{
    if (!String.IsNullOrEmpty(temp))
        parseDeviceType(temp);

    checkTypeFound();
}
于 2012-09-04T10:10:16.070 回答
1

尝试使用以下内容:

if (DataBuffer != null && DataBuffer.Contains(ok)) 
{
   okFound = true;
}
于 2012-09-04T10:14:46.553 回答
0

您应该DataBuffer在构造函数中将值设置为 null 以外的值。如果你不能这样做,那么你可以将它设置为string.Empty而不是 null 以避免 null 异常。但在对对象启动实例方法之前检查 null总是更好。

于 2012-09-04T10:09:14.493 回答