【问题标题】:"Object reference not set to an instance of an object" while filling an array of an array填充数组的数组时“对象引用未设置为对象的实例”
【发布时间】:2015-07-02 16:02:30
【问题描述】:

您好,我有以下代码

Partial Public Class DT_AnalyseDetail

    Private componentField As String
    Private contentField As String

    Public Property Component() As String
    Get
        Return Me.componentField
    End Get
    Set(value As String)
        Me.componentField = Value
    End Set
    End Property

    Public Property Content() As String
    Get
         Return Me.contentField
    End Get
    Set(value As String)
        Me.contentField = Value
    End Set
    End Property
End Class

Partial Public Class DT_Analyse

    Private detailField() As DT_AnalyseDetail
    Private batchField As String

    Public Property Detail() As DT_AnalyseDetail()
    Get
        Return Me.detailField
    End Get
    Set(value As DT_AnalyseDetail())
        Me.detailField = value
    End Set
    End Property

    Public Property Batch() As String
    Get
        Return Me.batchField
    End Get
    Set(value As String)
        Me.batchNoField = Value
    End Set
    End Property
End Class

Sub()

    Dim a_Myana(1) As DT_Analyse
    Dim a_Mydet(1) As DT_AnalyseDetail

    a_Mydet(0) = New DT_AnalyseDetail
    a_Mydet(0).Component = "TEST"
    a_Mydet(0).Content= "YES"

    a_Myana(0) = New DT_Analyse
    a_Myana(0).Batch= "123"
    a_Myana(0).Detail(0) = New DT_AnalyseDetail
    a_Myana(0).Detail(0) = a_Mydet(0)

End Sub

当我想填写 a_Myana(0).Detail(0) = a_Mydet(0) 时发生错误 我猜我的类/数组定义不正确。但我不确定如何处理它。 “细节”是否需要更多维度? 类定义是由 Visual Studios xsd.exe 从 xesd 文件编写的。

【问题讨论】:

  • 几乎所有 NullReference 异常都有相同的原因。有关这方面的帮助,请参阅 NullReference Exception in Visual BasicPublic Sub() 仅此而已,代码无效
  • 是的,我以前见过,但这并不能帮助我在我的例子中找到我的错误。 Public Sub 只是被放入其中以明确该类的定义是在“外部”完成的。 (明天检查 Plutonix 与阵列的链接,谢谢)
  • a_Mydet(1) 又名 null。没有。 Nothing 没有名为 Component 的属性。您需要在设置Component 属性之前实例化一个DT_AnalyseDetail 对象:a_Mydet(1) = New DT_AnalyseDetail()
  • 完美,谢谢,这么小的错误。我知道从零开始,在我的真实代码中是通过整数完成的,所以没关系,谢谢。

标签: arrays vb.net visual-studio-2010 object


【解决方案1】:

这条线并没有做你认为的所有事情:

Dim a_Mydet(1) As DT_AnalyseDetail

您认为它创建了一个 DT_AnalyseDetail 对象数组,但这确实不会发生。相反,它会创建一个DT_AnalyseDetail 对象references 数组。此时,这些引用中的每一个都具有Nothing 的值(这些引用不引用任何对象)。这些Nothing 引用还没有为Component 属性分配空间,因此分配的行失败。

顺便说一句,这里有 两个 引用,而不是一个,因为 VB.Net 数组默认为 0 索引。

要修复代码,您需要这样做:

Sub()

    Dim a_Mydet(1) As DT_AnalyseDetail
    a_Mydet(1) = New DT_AnalyseDetail()
    a_Mydet(1).Component = "TEST"

End Sub

.


现在查看更新后的问题。

你有这些行:

a_Myana(0) = New DT_Analyse
a_Myana(0).Batch= "123"
a_Myana(0).Detail(0) = New DT_AnalyseDetail
a_Myana(0).Detail(0) = a_Mydet(0)

在这里,您期望New DT_Analyse 表达式为Detail 属性创建一个新数组。这不会发生。数组是对象。属性是对象引用。就像上一期一样,您必须首先确保对象引用引用的不是Nothing。你需要这样做:

a_Myana(0) = New DT_Analyse
a_Myana(0).Batch= "123"
 a_Myana(0).Detail = New DT_AnDT_AnalyseDetail(0)
a_Myana(0).Detail(0) = New DT_AnalyseDetail
a_Myana(0).Detail(0) = a_Mydet(0)

【讨论】:

  • 是的,我明白了。谢谢你。但是当我以在数组中有一个数组的方式使用它时,出现了一个新问题。我将在问题中添加它。
【解决方案2】:

代替

a_Myana(0).Detail(0) = New DT_AnalyseDetail
a_Myana(0).Detail(0) = a_Mydet(0)

我设置了

a_Myana(0).Detail() = a_Mydet

它有效:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多