2011-12-15 5 views
0

У меня есть довольно простой фрагмент кода:Исключение Null Reference при проверке строки для Null?

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 

Что находится внутри класса, который переопределяет пользовательский список базы. Код occassionaly бросать необработанное исключение, System.NullReferenceException, на этой линии при использовании в производстве:

If _PurchaseDelivery IsNot Nothing AndAlso _PurchaseDelivery.DefaultSKUBinID.HasValue Then 

DeafultSKUBinID объявлен как Integer? (Nullable Int) в PurchaseDelivery классе. Я не вижу, что может вызвать эту ошибку, почему бы это вернуть ошибку?

+0

Не удается воспроизвести с прикрепленным отладчиком? Может быть, это немного другая сборка? Несоответствие номера строки? –

+0

Спасибо. Такая же сборка (точно такая же сборка) и не может воспроизводиться с прикрепленным отладчиком или на любой машине Dev. Перекомпилирован (чтобы убедиться, что это не какая-то причуда) и все еще происходит. Очень редко, но очень странно. – Molloch

ответ

0

В итоге я нашел ответ на свою собственную проблему. Класс, вызывающий ошибку, возвращал неверный номер строки в исключении. Понятия не имею почему.

Любое исключение в этом файле возвращает номер строки, который на 1 меньше, чем код, вызвавший исключение, поэтому нулевая ссылка находится на следующей строке. Я понятия не имею, почему это происходит, я удалил все пробелы в файле и перекомпилировал их и увижу, не приведет ли это к проблеме.

Спасибо всем за помощь.

1

В соответствии с кодом (В OP) фрагмент PurchaseDelivery не создан (возможно, он был создан где-то). Вы можете попытаться изменить, если заявление, как:

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

+0

@DennisPalmer - ОП пытался этот случай (проблема), и вы видите, что он/она размещен здесь. Существует множество случаев, когда могут быть сделаны исключения. Может быть DefaultSKUBinID равно null. – adatapost

+0

Удалено мое нижнее изображение после ответа, отредактированного, хотя выход из метода запрещает вызов MyBase.InsertItem', который, как я считаю, не является желаемым результатом OP. – CoderDennis

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

Я думал, что назначение типов с нулевым типом состояло в том, чтобы разрешить им устанавливать ничего, а затем проверить их на нуль, проверив их .HasValue – Molloch

+0

Просто для тестирования я создал следующее консольное приложение: ' Sub Main() Dim i As Integer? = 1 Console.WriteLine ("HasValue это:" & i.HasValue) Console.WriteLine ("Значение:" & я) не я = Ничто Console.WriteLine ("HasValue это:" & i.HasValue) Console.ReadKey() End Sub ' которая выводит следующее, как и ожидалось: HasValue: истина Значение: 1 HasValue является: Ложные Если система была сбой, потому что это верно, то последняя строка Console.write даст одно и то же UE? – Molloch

+0

Мой ответ был основан на том факте, что ничто другое в этой строке не может вызвать это исключение; хотя я не уверен, как эта ошибка происходит. Можете ли вы опубликовать определение BuyDelivery? – UnhandledExcepSean

Смежные вопросы