在Null的行检查中是否为空引用异常?

时间:2011-12-15 00:00:07

标签: vb.net exception-handling

我有一段相当简单的代码:

Private _PurchaseDelivery as PurchaseDelivery

Protected Overrides Sub InsertItem(ByVal index As Integer, ByVal item As PurchaseDeliveryItem)
    Dim SKUBin As SKUBin
    If _PurchaseDelivery IsNot Nothing AndAlso _PurchaseDelivery.DefaultSKUBinID.HasValue Then
        SKUBin = item.StockOrderUnit.SKU.SKUBins.GetByBinID(_PurchaseDelivery.DefaultSKUBinID.Value)
        item.SKUBin = SKUBin
    End If

    MyBase.InsertItem(index, item)
End Sub

在一个覆盖自定义列表库的类中。当在生产中使用时,代码偶尔抛出一个未处理的异常System.NullReferenceException

    If _PurchaseDelivery IsNot Nothing AndAlso _PurchaseDelivery.DefaultSKUBinID.HasValue Then

DeafultSKUBinID在Integer?类中声明为PurchaseDelivery(Nullable Int)。我看不出可能导致此错误的原因,为什么会返回错误?

3 个答案:

答案 0 :(得分:1)

根据代码(在OP中)代码段PurchaseDelivery未实例化(可能是在某处创建的)。您可以尝试更改if语句,如:

Protected Overrides Sub InsertItem(ByVal index As Integer, ByVal item As PurchaseDeliveryItem)
    Dim SKUBin As SKUBin
    If IsNothing(_PurchaseDelivery) Then
           Exit Sub
    End If
    If IsNothing(_PurchaseDelivery.DefaultSKUBinID) Then
           Exit Sub
    End If
    If _PurchaseDelivery.DefaultSKUBinID.HasValue Then
        SKUBin = item.StockOrderUnit.SKU.SKUBins.GetByBinID(_PurchaseDelivery.DefaultSKUBinID.Value)
        item.SKUBin = SKUBin
    End If
    MyBase.InsertItem(index, item)
End Sub

答案 1 :(得分:1)

_PurchaseDelivery.DefaultSKUBinID什么都没有。

Private _PurchaseDelivery as PurchaseDelivery

Protected Overrides Sub InsertItem(ByVal index As Integer, ByVal item As PurchaseDeliveryItem)
    Dim SKUBin As SKUBin
    If _PurchaseDelivery IsNot Nothing AndAlso _PurchaseDelivery.DefaultSKUBinID isnot nothing andalso _PurchaseDelivery.DefaultSKUBinID.HasValue Then
        SKUBin = item.StockOrderUnit.SKU.SKUBins.GetByBinID(_PurchaseDelivery.DefaultSKUBinID.Value)
        item.SKUBin = SKUBin
    End If

    MyBase.InsertItem(index, item)
End Sub

答案 2 :(得分:0)

我最终找到了自己问题的答案。导致错误的类在异常中返回错误的行号。我不明白为什么。

此文件中的任何异常都会返回一个行号,该行号比引起异常的代码少1,因此空引用位于下一行。我不知道为什么会发生这种情况,我已经删除了文件中的所有空格并重新编译,并查看是否会导致问题消失。

感谢大家的帮助。