2015-06-30 23 views
-1

我在Class A中定义了ArrayList。然后我想在Class B中构建这个数组,并在Class A中使用它。在外部类中构建ArrayList - vb.net

我定义的ArrayList为:

Public arrayList As ArrayList 

然后,在Class B我做的:

Dim trLogkEmpty As New A 
'Loop with strEspece definition 
    trLogkEmpty.arrayList.Add(strEspece) 
'End Loop 

程序抛出我这个错误:

NullReferenceException

我不知道为什么,因为strEspece从来没有成为空(我测试过)。我不知道是否有其他原因。

另外,当我循环访问Class A中的arrayList元素时,我又得到NullReferenceException。这是循环代码:

For Each logkNull In Me.arrayElemWithLogkEmpty 
    Console.WriteLine(logkNull) 
Next 

我不知道第一个异常会发生什么,但代码运行“正确”。在第二个异常中,我想这就像我失去了数组的元素值。我不知道如何解决它...任何帮助?我接受不同的方式来解决它!

+0

您的类A的构造函数是否初始化'arrayList'? – Phylogenesis

+0

在ClassA中,您需要创建ArrayList的一个实例。例如'Public arrayList As New ArrayList' – Blackwood

+1

不,NRE更可能是因为'trLogkEmpty'或'arrayList'没有被初始化,而没有'strEspece' - 我们缺乏这个任何上下文,尽管没有真正的代码。请参阅[Visual Basic中的NullReference异常](http://stackoverflow.com/a/26761773/1070452)以获取有关此帮助的信息。 – Plutonix

回答

1

你犯了两个相同的错误。 A NullReferenceException意味着您正试图访问尚未实例化的对象的属性或方法。您正试图访问AA.arrayList,而无需先创建它们的新实例。

所以,而不只是:

trLogkEmpty.arrayList.Add(strEspece) 

你应该有:

Dim trLogkEmpty As New A() 
trLogkEmpty.arrayList = New ArrayList() 
trLogkEmpty.arrayList.Add(strEspece) 

然而,我必须坚持,你避免ArrayList,还您避免实例化的公共成员来自该班级以外的班级。我建议使用强类型集合类(如List(Of T)),并在A中具有只读属性来处理其实例化和可见性,以便集合(不是其内容)不能在A之外修改:

Public Class A 

    Private _myList As IList(Of String) 

    Public ReadOnly Property MyList As IList(Of String) 
     Get 
      If _myList Is Nothing Then 
       _myList = New List(Of String) 
      End If 
      Return _myList 
     End Get 
    End Property 

End Class 

现在您有:

Dim trLogkEmpty As New A() 
trLogkEmpty.MyList.Add(strEspece) 

你很可能会需要保持A您的实例左右,因此类B或许应该看起来有点像:

Public Class B 

    Private _a As A 

    Public Sub New() 
     _a = New A() 
    End Sub 

    ' ... your methods that use _a.MyList 

End Class 
+0

OP指出ClassA的一个实例已经创建了'Dim trLogkEmpty As New ClassA'。看起来似乎没有创建ArrayList的实例(因为这是唯一的其他可能性)。 – Blackwood

+0

@Blackwood:啊,是啊......错过了!谢谢 –

0

我终于明白了。当我在初始化类中的数组“A”我忘记创建ArrayList类的一个实例,具体我忘了把New

Public arrayElemWithLogkEmpty As New ArrayList 

因此,部分地@Blackwood是正确的!

谢谢大家,原谅我关于vb.net的基本知识。

+0

我把'arrayList'的'Shared'关键字并声明为'As New',所以我解决了它的问题。 – daro

+0

你让它成为A类的静态成员,但是从B类访问它。是否有任何理由认为它不能从一开始就是B类的成员? –

+0

是的,这就是我最终做到的。我在ArrayList中声明了ArrayList为'Public Shared'。然后我将这个变量在类A中实例化为: 'B.arrayList.Count' 例如。 – daro