我是使用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”行中......
有必要尝试一下吗?等等?
谢谢!
答案 0 :(得分:4)
try / catch不会解决错误,它只会捕获错误并允许您以某种方式处理它比应用程序崩溃更优雅(这至少是向好方向迈出的一步)。 / p>
鉴于代码的其余部分,很可能在这一行:
user.Email.email
.Email
上的user
属性可能是null
(或VB中的Nothing
)。你可以通过一些调试来确认吗?
如果是这种情况,则问题变为什么是Utilizador
以及它是如何初始化的?它是你的自定义对象吗?该对象上.Email
属性的类型是什么?鉴于此处的用法,它看起来像某种类型的引用类型。
默认情况下,引用类型为null
(Nothing
),除非初始化为引用类型的某个实例。那么可能在这里发生的是你有一个默认构造函数,它适用于所有值类型,但从不初始化该属性。因此,在初始化为某个属性之前,您无法访问该属性。
解决这个问题可能就像在Utilizador
的构造函数中初始化该属性一样简单。像这样:
Public Sub New()
Me.Email = New Email()
End Sub
现在,我猜测类型名称为Email
。它可能不是,你必须确定。 (您不会在当前在问题中发布的代码中显示它。)但这里的基本前提是引用类型需要在可以使用之前进行初始化。通常最好的地方是对象的构造函数。
注意: user.Telefone
可能会遇到同样的问题。