检查空字节

时间:2011-09-06 18:17:50

标签: vb.net

我正在使用Visual Basic .NET来使用USB HID设备。

大多数时候,我可以完美地从它接收数据......但是每千次传输中就有一次传输,我的代码会认为它实际上没有收到数据。

设备写入一个字节数组。我想通过这样做来检查收到的数据包是否为空:

If myDevice.dataPacket(1) <> Nothing then
    myDevice.rxDataReady = False

不幸的是,即使有这个,我得到一个NullReferenceException,说对象引用没有设置为对象的实例。

是否有不同的方法来执行此操作,或者我应该只处理NullReferenceException?如果我每分钟执行这个例程几百次,那么将添加异常缓慢的事情吗?

3 个答案:

答案 0 :(得分:7)

所以,有几件事。

  1. Byte是值类型,因此永远不会是null。在VB.Net中,当您使用等号Nothing设置或检查=时,您实际上正在设置或检查该值是否保持“默认值”。对于数字类型,“默认值”为零,因此这两个语句是相同的:

    If MyByte = Nothing Then ...

    If MyByte = 0 Then ....

  2. 由于上述规则,在访问字节时不应该收到NullReferenceException(NRE),因为字节不能为空。但是,持有字节的东西可以为空。所以在你的情况下你应该检查:

    If myDevice.dataPacket IsNot Nothing Then

  3. 根据dataPacket中字节的设置方式,您可能还需要检查dataPacket.Length属性(在检查dataPacket不为空之后)以确保数组中有足够的索引。如果你超出指数,你将获得IndexOutOfRangeException

    If (myDevice.dataPacket IsNot Nothing) AndAlso (myDevice.dataPacket.Length >= 100) Then

答案 1 :(得分:0)

尝试将语法更改为:

If NOT myDevice.dataPacket(1) is Nothing then
    myDevice.rxDataReady = False

答案 2 :(得分:0)

你在初始化它(新)吗?

myDevice.dataPacket = new List(Of Byte)()