2012-12-21 4 views
3

호기심 VB.net에서 내 프로그램을 디버깅 할 때 왜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 On을 켜십시오. –

답변

4

S1 및 S2와 같은 클래스 수준 변수는 개체 생성 프로세스에서 매우 초기에 초기화됩니다. Combobox1 및 Combobox2와 같은 시각적 컨트롤은 InitializeComponent() 메서드가 호출 될 때까지 생성되지 않습니다.이 메서드는 생성자가 끝날 때까지 생성되지 않습니다.

따라서 S1을 Combobox1.Text의 값으로 설정하려고 할 때 Combobox1 개체가 아직 만들어지지 않았으며 Null 개체의 .Text 속성을 참조하면 해당 예외가 발생합니다.

대신 생성자 끝에 또는로드와 같은 이벤트에 대한 응답으로 값을 설정하십시오.

당신은 또한이 같은 ... 속성으로 그들을 구축을 시도 할 수 있습니다 :

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

생성자의 순서를 어떻게 설정합니까? 답변 해주셔서 감사합니다. – Tlm7

+0

코드의 행을 생성자의 맨 아래로 이동하십시오. 생성자는 다른 파일 (디자이너 파일)에 있으므로 Load 이벤트를 사용하는 것이 좋습니다. –

+0

고맙습니다. – Tlm7