在VB.net中出现了对象引用错误

3

我想知道在尝试在VB.net中调试我的程序时为什么会出现这个错误。

Object Reference not set to an instance of the object.

它说我的错误是由第4行和第5行引起的:
Public Class Form1

Dim tSize
Dim S1 As String = ComboBox1.Text
Dim S2 As String = ComboBox2.Text

Private Sub FitContents()
    tSize = TextRenderer.MeasureText(TextBox3.Text, TextBox3.Font)
    TextBox3.Width = tSize.Width + 10
    TextBox3.Height = tSize.Height
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    TextBox1.Text = S1
    TextBox2.Text = S2
End Sub

Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
    Call FitContents()
End Sub

End Class

我非常感激如果有人可以解释一下为什么我会收到这个错误信息。

1
tSize没有指定类型。这是故意的吗?我怀疑你没有开启Option Strict。给自己一个方便,打开Option Strict。 - Chris Dunaway
1个回答

4

类级别的变量(如S1和S2)在对象构造过程中非常早就初始化了。你的可视化控件(如Combobox1和Combobox2)直到调用InitializeComponent()方法才会创建,而这个方法直到构造函数接近末尾时才被调用。

因此,在你试图将S1设置为Combobox1.Text的值时,Combobox1对象还没有被创建,尝试引用一个Null对象的.Text属性将会给你抛出异常。

相反,将这些值设置在构造函数的末尾或响应Load等事件时。

你也可以尝试将它们作为属性构建...就像这样:

Private Property S1() As String
    Get
        Return ComboBox1.Text
    End Get
    Set (ByVal value As String)
        ComboBox1.Text = value
    End Set
End Property

我该如何在构造函数中设置事物的顺序?感谢您的回答。 - Tlm7
将代码行移到构造函数底部。构造函数位于另一个文件(设计师文件)中,这就是为什么我建议使用Load事件的原因。 - Joel Coehoorn
我尝试在构造函数末尾加入“Dim S1 As String = ComboBox1.Text”,但是仍然收到错误消息。我还尝试在Form_load事件中定义变量,但也没有奏效。 - Tlm7
不要在那里定义变量...只需在那里进行赋值。另外,您是否考虑将它们构建为属性?我会将其编辑到我的答案中,以便您可以看到代码片段。 - Joel Coehoorn
哇,现在我感觉很愚蠢。非常感谢您帮助我从错误中学习,我对Visual Basic还很陌生。 - Tlm7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接