0

私はNullReferenceExceptionを取得しています:

faxnum = Customer.ContactLink.Contact.DefaultFaxLink.Phone.PhoneNumber

null ref は DefaultFaxLink にあります。ファックス番号がないため、DefaultFaxLink は初期化されません。初期化されていれば、割り当てでエラーが発生しないことがわかっています。

それで、私の質問は、各オブジェクトをテストして何もないかどうかを確認することなく、例外をトラップできる方法はありますか?

ステートメントの右側部分全体を処理して、一部が何もない場合は、左側の変数に何も割り当てないようにしたいだけです。

それ以外では、ベース オブジェクトでリフレクションを使用して、各メンバーとそのサブメンバーを評価し、空の値を割り当てることはできますか?

4

2 に答える 2

1

NullReferenceExceptionにTry-Catchブロックを使用できます

Public Class Customer
    Public ContactLink As ContactLink
End Class

Public Class ContactLink
    Public Contact As Contact
End Class

Public Class Contact
    Public DefaultFaxLink As FaxLink
End Class

Public Class FaxLink
    Public Phone As Phone
End Class

Public Class Phone
    Public PhoneNumber As String
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim objCustomer As New Customer
    objCustomer.ContactLink = New ContactLink
    objCustomer.ContactLink.Contact = New Contact
    objCustomer.ContactLink.Contact.DefaultFaxLink = New FaxLink

    Dim PhoneNumber As String = ""

    Try
        PhoneNumber = objCustomer.ContactLink.Contact.DefaultFaxLink.Phone.PhoneNumber
    Catch ex As NullReferenceException
        PhoneNumber = ""
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

    If Not String.IsNullOrEmpty(PhoneNumber) Then
        MsgBox("Fax number is..." & PhoneNumber)
    Else
        MsgBox("No fax number!")
    End If

End Sub
于 2012-06-28T00:19:05.787 に答える
0

関数を記述します。

Public Class Customer

    Public Function GetFaxNumberSafe() As String

        If Me.ContactLink IsNot Nothing AndAlso
           Me.ContactLink.Contact IsNot Nothing AndAlso
           Me.ContactLink.Contact.DefaultFaxLink IsNot Nothing AndAlso
           Me.ContactLink.Contact.DefaultFaxLink.Phone IsNot Nothing Then

            Return Customer.ContactLink.Contact.DefaultFaxLink.Phone.PhoneNumber

        Else

            Return Nothing

        End If

    End Function

End Class

また、アクセス時に遅延ロードインスタンス化するようにオブジェクトを設定して、常にオブジェクト参照を取得することもできます。

Public Class Customer

    Private _contactLink As New Lazy(Of ContactLink)()

    Public ReadOnly Property ContactLink As ContactLink
        Get
            Return _contactLink.Value
        End Get
    End Property

End Class
于 2012-06-27T21:45:04.080 に答える