Vb.net NullReferenceException但在调试期间我有一个对象?

Vb.net NullReferenceException但在调试期间我有一个对象?,vb.net,nullreferenceexception,Vb.net,Nullreferenceexception,我正在试图弄清楚为什么我的代码抛出空引用异常 我正在尝试将对象添加到列表中。该对象可以是4种类型中的一种,我在相关代码之后有所有定义。此代码位于select case语句中4个图片框的按钮单击处理程序中 下面是有问题的代码 Dim count As Integer = 0 Dim a_component As Object = Nothing Select Case (p.Name) Case TranspositorPictureBox.Name

我正在试图弄清楚为什么我的代码抛出空引用异常

我正在尝试将对象添加到列表中。该对象可以是4种类型中的一种,我在相关代码之后有所有定义。此代码位于select case语句中4个图片框的按钮单击处理程序中

下面是有问题的代码

    Dim count As Integer = 0
    Dim a_component As Object = Nothing

    Select Case (p.Name)
        Case TranspositorPictureBox.Name
            Form2.ShowDialog(Me)
            count = TNumericUpDown.Value
            a_component = New Transpositor(tempTranspositorDivert)
        Case ZonePictureBox.Name
            count = ZNumericUpDown.Value
            a_component = New Zone()
        Case InductionPictureBox.Name
            count = IndNumericUpDown.Value
            a_component = New Induction()
        Case InclinePictureBox.Name
            count = IncNumericUpDown.Value
            a_component = New Incline()
    End Select

    For i = 1 To count
        Dim newPic As PictureBox = New PictureBox()
        newPic.Image = p.Image
        newPic.Size = p.Size
        newPic.SizeMode = p.SizeMode

        sys.Add(a_component)

        LayoutFlowLayout.Controls.Add(newPic)
    Next
下面是类定义。变量sys的类型为TranSorter

Public Class TranSorter
Public width As Integer
Public components As List(Of Object)

Public Sub New(ByVal the_width As Integer)
    Me.width = the_width
    Me.components = New List(Of Object)
End Sub

Public Sub Add(ByVal next_component As Object)
    Me.components.Add(next_component)
End Sub

End Class

Public Class Transpositor
Public length As Integer
Public divert As Object

Public Sub New(ByVal a_divert As Object)
    Me.divert = a_divert
    Me.length = ComponentLengths.TranspositorLength
    Form1.Transpositors += 1
End Sub
End Class

Public Class Zone
Public length As Integer

Public Sub New()
    Me.length = ComponentLengths.ZoneLength
    Form1.Microzones += 1
End Sub
End Class

Public Class Induction
Public length As Integer

Public Sub New()
    Me.length = ComponentLengths.InductionLength
    Form1.Inductions += 1
End Sub
End Class

Public Class Incline
Public length As Integer

Public Sub New()
    Me.length = ComponentLengths.InclineLength
    Form1.Inclines += 1
End Sub
End Class
sys.add行正在引发异常。这是我初始化sys的代码

Dim sys As TranSorter

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

sys = New TranSorter(temp_width)

出于某种原因,我怀疑您的p.名称不等于您在If子句中检查的四种情况之一。作为额外的预防措施,我建议考虑添加一个总括Else子句和/或检查一个_组件是否为空

Select Case (p.Name)
    Case TranspositorPictureBox.Name
        Form2.ShowDialog(Me)
        count = TNumericUpDown.Value
        a_component = New Transpositor(tempTranspositorDivert)
    Case ZonePictureBox.Name
        count = ZNumericUpDown.Value
        a_component = New Zone()
    Case InductionPictureBox.Name
        count = IndNumericUpDown.Value
        a_component = New Induction()
    Case InclinePictureBox.Name
        count = IncNumericUpDown.Value
        a_component = New Incline()
    Case Else
        Exit Sub ' Function/etc
End Select

if a_component IsNot Nothing Then
  For i = 1 To count
    Dim newPic As PictureBox = New PictureBox()
    newPic.Image = p.Image
    newPic.Size = p.Size
    newPic.SizeMode = p.SizeMode

    sys.Add(a_component)

    LayoutFlowLayout.Controls.Add(newPic)
  Next
End If

除非sys为Nothing,否则代码不应引发任何异常。
这可能是因为Form_Load事件(初始化sys var的地方)没有执行。 只需在线路上设置断点,就可以轻松检查这种情况

 sys = New TranSorter(temp_width) 
然后将另一个断点放在

 sys.Add(a_component) 

行并检查sys var在每个构造函数中是否为nothing

,除了您引用名为Form1的对象变量的类Transorter的构造函数。从何处初始化此变量?Form1是基础表单,它是通过设计器初始化的。请尝试将所有Form1操作移到类构造函数外部和按钮内部1\u Click Handler刚刚尝试过。form1操作似乎不是引发异常的操作。我的Add函数有什么问题吗?哪一行抛出异常?我与调试器进行了检查,它总是得到正确的值。为了安全起见,我添加了else子句。但是,在抛出异常时,它仍在抛出异常。一个_组件被分配了一个值和一个正确的值。sys是否可能尚未设置(如果您在表单加载的释放模式下有一个竞争条件)?如果sys不是空的,请尝试添加一个检查
,现在我只需要弄清楚为什么sys不是空的?您如何调用有问题的代码?它是在form init上还是在form.show之前来自外部表单?这可能发生在form load之前,您正在设置sys变量。在上面的我的form_load函数中,它没有处理任何事情,因此它从未被调用,sys也从未被初始化