2011-12-15 33 views
0

我有一個相當簡單的代碼:行檢查爲空的空引用異常?

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 

哪個是哪個覆蓋的自定義列表基類中。在PurchaseDelivery

If _PurchaseDelivery IsNot Nothing AndAlso _PurchaseDelivery.DefaultSKUBinID.HasValue Then 

DeafultSKUBinID被聲明爲Integer?(可空智力):在生產中使用的代碼時occassionaly拋出未處理的異常,System.NullReferenceException,在這條線上。我看不到可能會導致此錯誤的原因,爲什麼會返回錯誤?

+0

無法用附加的調試器重現?也許這是一個稍微不同的構建?行號不匹配? – 2011-12-15 00:02:24

+0

謝謝。相同的版本(完全相同的版本),無法使用附加的調試器或在任何開發機器上重現。重新編譯(以確保它不是一些怪癖)並仍在發生。非常罕見,但很奇怪。 – Molloch 2011-12-15 00:21:04

回答

0

我終於找到了自己問題的答案。導致錯誤的類在異常中返回錯誤的行號。我不知道爲什麼。

此文件中的任何異常都會返回一個行號,表示它引起該異常的代碼少1,因此空引用位於下一行。我不知道爲什麼發生這種情況,我已經刪除了文件中的所有空白並重新編譯,並會看到是否導致問題消失。

感謝大家的幫助。

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 
+0

在這個問題中構成的`AndAlso`實現了同樣的事情。 – CoderDennis 2011-12-15 04:18:29

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