System.NullReferenceException(Visual Basic)

时间:2014-01-02 15:58:49

标签: vb.net exception nullreferenceexception

我是使用visual basic的新工作,我遇到了一个无法解决的问题......

 Private Sub Submeter_Click(sender As Object, e As EventArgs) Handles Submeter.Click
    Dim user As New Utilizador
    Dim utilizadores = db.GetTable(Of Utilizador)()


    If (ShortIDTextBox.Text = "") Then
        MessageBox.Show("É necessário inserir um Username.", "Utilizador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    ElseIf (TextBox1.Text = "") Then
        MessageBox.Show("É necessário inserir um Nome.", "Utilizador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    ElseIf (MoradaTextBox.Text = "") Then
        MessageBox.Show("É necessário inserir uma morada.", "Utilizador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    ElseIf (PrefixoComboBox.SelectedItem = "") Then
        MessageBox.Show("É necessário inserir um Prefixo.", "Utilizador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    ElseIf ((EmailTextBox.Text = "") And (TeleTextBox.Text = "")) Then
        MessageBox.Show("É necessário inserir um email ou telefone.", "Utilizador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    Else
        Dim query = (From Utilizador In utilizadores Where Utilizador.ShortID = ShortIDTextBox.Text Select Utilizador)

        If (query.Count <> 0) Then
            MessageBox.Show("Já existe um username igual.", "Utilizador", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
            user.Nome = TextBox1.Text

            user.morada = MoradaTextBox.Text

            user.Prefixo = PrefixoComboBox.SelectedItem

            user.Email.email = EmailTextBox.Text

            user.Telefone.Telefone = TeleTextBox.Text

            user.ShortID = ShortIDTextBox.Text

            If PrefixoComboBox.SelectedItem.ToString() = "PD" Then
                user.prioridadeCorrente = 1
            End If
            If PrefixoComboBox.SelectedItem.ToString() = "PR" Then
                user.prioridadeCorrente = 2
            End If
            If PrefixoComboBox.SelectedItem.ToString() = "RS" Then
                user.prioridadeCorrente = 3
            End If
            If PrefixoComboBox.SelectedItem.ToString() = "BS" Then
                user.prioridadeCorrente = 3
            End If
            If PrefixoComboBox.SelectedItem.ToString() = "MS" Then
                user.prioridadeCorrente = 3
            End If
            If PrefixoComboBox.SelectedItem.ToString() = "DS" Then
                user.prioridadeCorrente = 3
            End If
            If PrefixoComboBox.SelectedItem.ToString() = "SF" Then
                user.prioridadeCorrente = 3
            End If
            If PrefixoComboBox.SelectedItem.ToString() = "XT" Then
                user.prioridadeCorrente = 3
            End If


            utilizadores.InsertOnSubmit(user)
            db.SubmitChanges()
            Form2.utilizador = user
        End If

        Form2.Show()
        Me.Hide()
    End If

End Sub

这是我的代码,当我运行项目时,它显示没有错误,但是当我填写表单时,它会断开并向我显示错误“类型'System.NullReferenceException'发生未处理的异常”在“user.Email.email = EmailTextBox.Text”行中......

有必要尝试一下吗?等等?

谢谢!

1 个答案:

答案 0 :(得分:4)

try / catch不会解决错误,它只会捕获错误并允许您以某种方式处理它比应用程序崩溃更优雅(这至少是向好方向迈出的一步)。 / p>

鉴于代码的其余部分,很可能在这一行:

user.Email.email

.Email上的user属性可能是null(或VB中的Nothing)。你可以通过一些调试来确认吗?

如果是这种情况,则问题变为什么是Utilizador以及它是如何初始化的?它是你的自定义对象吗?该对象上.Email属性的类型是什么?鉴于此处的用法,它看起来像某种类型的引用类型。

默认情况下,引用类型为nullNothing),除非初始化为引用类型的某个实例。那么可能在这里发生的是你有一个默认构造函数,它适用于所有值类型,但从不初始化该属性。因此,在初始化为某个属性之前,您无法访问该属性。

解决这个问题可能就像在Utilizador的构造函数中初始化该属性一样简单。像这样:

Public Sub New()
    Me.Email = New Email()
End Sub

现在,我猜测类型名称为Email。它可能不是,你必须确定。 (您不会在当前在问题中发布的代码中显示它。)但这里的基本前提是引用类型需要在可以使用之前进行初始化。通常最好的地方是对象的构造函数。

注意: user.Telefone可能会遇到同样的问题。