null引用不评估为空

时间:2012-10-09 13:54:26

标签: vb.net

我试图测试一个对象在得到它的值之前是否为空,但是我得到一个错误“NullReferenceException”

发生在第一行:

If Not ORInvoiceLineRet.InvoiceLineRet.ItemRef.FullName Is Nothing Then
    li.FullName = ORInvoiceLineRet.InvoiceLineRet.ItemRef.FullName.GetValue()
End If

System.NullReferenceException {“对象引用未设置为对象的实例。”}

如何在不尝试处理try / catch中的错误的情况下对此进行测试?

2 个答案:

答案 0 :(得分:7)

涉及的对象越多越好:

  • ORInvoiceLineRet可能一无所有
  • ORInvoiceLineRet.InvoiceLineRet可能一无所有
  • ORInvoiceLineRet.InvoiceLineRet.ItemRef可能一无所有
  • ORInvoiceLineRet.InvoiceLineRet.ItemRef.FullName可能一无所有

所以这里唯一安全的方法是:

If ORInvoiceLineRet IsNot Nothing _
   AndAlso ORInvoiceLineRet.InvoiceLineRet IsNot Nothing _
   AndAlso ORInvoiceLineRet.InvoiceLineRet.ItemRef IsNot Nothing _
   AndAlso ORInvoiceLineRet.InvoiceLineRet.ItemRef.FullName IsNot Nothing  Then
    li.FullName = ORInvoiceLineRet.InvoiceLineRet.ItemRef.FullName.GetValue()
End If

答案 1 :(得分:2)

ORInvoiceLineRet.InvoiceLineRet.ItemRefNothingORInvoiceLineRet.InvoiceLineRetNothingORInvoiceLineRetNothing

很难访问Nothing的属性,因此会抛出NullReferenceException

您可以使用OrElse

一次性测试链
If Not (ORInvoiceLineRet Is Nothing OrElse _
    ORInvoiceLineRet.InvoiceLineRet Is Nothing OrElse _
    ORInvoiceLineRet.InvoiceLineRet.ItemRef Is Nothing OrElse _
    ORInvoiceLineRet.InvoiceLineRet.ItemRef.FullName Is Nothing)

End If

如果左表达式的评估结果为True,则OrElse将无法评估该权利。